有很多例子,在這裏描述瞭如何使用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