2009年3月11日 星期三

Row_number 的使用

利用分析函數,求得排名, 再利用排名,來控制資料輸出格式.(以下為MsSQL語法,Oracle 也有類似功能)
SELECT (CASE WHEN rank2 = 1 THEN aaa ELSE '' END) AS BreakA, bbb 
--> 相同的 aaa 只出現一次,像作報表一樣
FROM
(SELECT c.aaa, c.bbb,
row_number() OVER
(partition BY c.aaa, c.bbb ORDER BY c.aaa, c.bbb) AS rank1,
row_number() OVER
(partition BY c.aaa ORDER BY c.aaa, c.bbb) AS rank2
FROM dbo.ItemA AS a LEFT OUTER JOIN dbo.ItemC AS c
ON a.ItemID = c.ItemID) AS g
WHERE rank1 = 1 ---> 類似 distinct 的效果
ORDER BY aaa, bbb

註:
row_number():逐列排名,重複資料,不允許相同排名,仍有第1,2名之分.
rank():允許有2個第1名,此時就沒有第2名,直接跳第3名.
dense_rank():允許有2個第1名,第3個則為第2名,即名次不跳號.
ACCESS 不支援,其他資料庫尚未測過.
ACCESS 可以參考自身JOIN的方法達到類似的目的.

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。