我正在使用DB2来获取表,将其拆分为分区,然后在每个分区中对行进行排序。我的表格如下:
ID DATE EVENT
-- ---- -----
01 1999-06-01 a
01 1999-06-01 b
01 2006-01-01 a
01 2011-12-31 c
02 1999-01-01 a
02 2003-01-01 a
02 2003-01-01 b
02 2009-11-12 b
我想订购它以获得以下内容......
ID DATE EVENT SEQUENCE
-- ---- ----- --------
01 1999-06-01 a 1
01 1999-06-01 b 1
01 2006-01-01 a 2
01 2011-12-31 c 3
02 1999-01-01 a 1
02 2003-01-01 a 2
02 2003-01-01 b 2
02 2009-11-12 b 3
所以我在尝试:
select a.*, row_number() over(partition by ID,order by DATE) from mytable a
给了我:
ID DATE EVENT SEQUENCE
-- ---- ----- --------
01 1999-06-01 a 1
01 1999-06-01 b 2
01 2006-01-01 a 3
01 2011-12-31 c 4
02 1999-01-01 a 1
02 2003-01-01 a 2
02 2003-01-01 b 3
02 2009-11-12 b 4
如您所见,即使连续行可能与前一行具有相同的日期,也会忽略该行,并且会重复SEQUENCE列。
如果下一行与序列保留的日期相同,直到出现具有较晚日期的行,我该如何确保?
非常感谢。
答案 0 :(得分:2)
显然,row_number()
函数不会为窗口内的不同行返回相同的数字。您需要使用dense_rank()
函数。
顺便说一下,你的查询有一个语法错误,并且对列名使用保留字(在本例中为'DATE')不是一个好主意。
答案 1 :(得分:1)
您可以使用DENSE_RANK
函数,如果两行具有相同的值,则可以选择指定相同的等级,如下所示:
select a.*, DENSE_RANK() OVER(PARTITION BY ID ORDER BY DATE DESC) from mytable a;
<强>参考强>: