2012-08-26 68 views
2

希望有人能指出我在這裏的正確方向。row_number()分析函數的奇數行爲

查看下面的查詢。

SELECT day_id,month_id,time_id, 
row_number() over (partition BY month_id order by day_id) rn 
FROM minute_bars_fact order by month_id, day_Id, time_id 

生成輸出:

DAY_ID  MONTH_ID Time_id rn 
02-JAN-11 JAN-2011 1080 1 
02-JAN-11 JAN-2011 1081 2 
02-JAN-11 JAN-2011 1082 3 
02-JAN-11 JAN-2011 1083 4 
02-JAN-11 JAN-2011 1084 5 
02-JAN-11 JAN-2011 1085 6 
02-JAN-11 JAN-2011 1086 7 
02-JAN-11 JAN-2011 1087 8 

我預計這裏將是RN將只在每個新的一天遞增。顯然情況並非如此。我在這裏做錯了什麼?

編輯:

日子不總是一樣的。

02-JAN-11 JAN-2011 1436 357 
02-JAN-11 JAN-2011 1437 358 
02-JAN-11 JAN-2011 1438 359 
02-JAN-11 JAN-2011 1439 360 
03-JAN-11 JAN-2011 0 361 
03-JAN-11 JAN-2011 1 362 
03-JAN-11 JAN-2011 2 363 
03-JAN-11 JAN-2011 3 364 
+2

因爲所有的月份都是一樣的,所以'row_number()'[提供一個唯一的](http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm)每個_partition_這種行爲是正確的。我想你可能正在尋找'rank()'函數,如果日期相同,它將返回相同的數字。 – Ben

回答

4

我在這裏的預期是在RN將只在每個新的一天遞增。

不是這樣的。您需要使用RANKDENSE_RANK來實現此行爲。不是ROW_NUMBER

+0

這個技巧。謝謝! – Dave

+1

http://sqlfiddle.com/#!4/78ab0/5 – Dave

+1

僅當DAY_ID不包含時間組件時,如在sqlfiddle中。最好使用trunc(day_id)來確保。 –