如何在分区内的表中排序行?

时间:2014-05-30 15:40:08

标签: sql db2

我正在使用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列。

如果下一行与序列保留的日期相同,直到出现具有较晚日期的行,我该如何确保?

非常感谢。

2 个答案:

答案 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;

<强>参考

Using OLAP specifications