有很多例子,在这里描述了如何使用row_number()
检索组中的第n行的答案。
通过...WHERE Cnt < 6
可以帮助您了解您正在尝试实现的目标。
如果您似乎试图检索每个国家的前六个条目,那么您希望将您的查询置于子选择中,因为row_number()结果无法在WHERE
子句中访问相同的查询;做这样的事情......
SELECT t.State_Name,
t.Customer_Name,
t.qty
FROM
(
SELECT t3.State_Name,
t2.Customer_Name,
sum(t1.Qty) AS qty,
row_number() OVER (PARTITION BY t3.state_name ORDER BY t3.state_name DESC) AS Cnt
FROM t1
INNER JOIN T2 ON t1.customer_code = t2.customer_code
INNER JOIN t3 ON t3.Area_code = t1.Area_code
GROUP BY State_Name,Customer_Name
) t
WHERE Cnt < 6
但是,这不会给你最高量的六国也不会给你在每个国家的最高量的六个客户。在任何一种情况下,按照与分区列相同的列进行排序会给您带来非确定性结果;您将需要更改row_number()
函数上的ORDER BY
以使用sum(qty)
。
对于后者只是改变ORDER BY
...
SELECT t.State_Name,
t.Customer_Name,
t.qty
FROM
(
SELECT t3.State_Name,
t2.Customer_Name,
sum(t1.Qty) AS qty,
row_number() OVER (PARTITION BY t3.state_name ORDER BY sum(t1.Qty) DESC) AS Cnt
FROM t1
INNER JOIN T2 ON t1.customer_code = t2.customer_code
INNER JOIN t3 ON t3.Area_code = t1.Area_code
GROUP BY State_Name,Customer_Name
) t
WHERE Cnt < 6
对于前者,你也将需要删除PARTITION BY
...
SELECT t.State_Name,
t.Customer_Name,
t.qty
FROM
(
SELECT t3.State_Name,
t2.Customer_Name,
sum(t1.Qty) AS qty,
row_number() OVER (ORDER BY sum(t1.Qty) DESC) AS Cnt
FROM t1
INNER JOIN T2 ON t1.customer_code = t2.customer_code
INNER JOIN t3 ON t3.Area_code = t1.Area_code
GROUP BY State_Name,Customer_Name
) t
WHERE Cnt < 6
谢谢你,帮我 – Sasank