根据Oracle中的两个日期排名

时间:2013-06-01 11:50:12

标签: sql oracle analytic-functions

我有一个查询,结果如下:

我以为我可以使用dense_rank在一个时间间隔内对用户细分进行分组。但它不起作用。

CUST_ID EVENT_ID SEGMENT_ID SEGMENT_CODE       DATE_FROM              DATE_TO
100      1424      21            A         2011.01.05. 13:03:12   2011.01.06. 23:40:13
100      1566      21            A         2011.01.06. 23:40:13   2011.02.28. 11:48:52
100      1580      21            A         2011.02.28. 11:48:52   2012.04.30. 2:49:53
100      1601      45            Y         2012.04.30. 2:49:53    2012.05.29. 21:12:27
100      1663      45            Y         2012.05.29. 21:12:27   2012.05.30. 11:11:23
100      1710      45            Y         2012.05.30. 11:11:23   2012.08.01. 5:14:36
100      1875      114           H         2012.08.01. 5:14:36    2012.09.01. 20:26:42
100      1880      33            F         2012.09.01. 20:26:42   2012.09.03. 9:12:23
100      1901      21            A         2012.09.03. 9:12:23    2012.09.03. 9:12:23
100      1903      21            A         2012.09.03. 9:12:23    2012.10.25. 17:25:14
100      1966      223           R         2012.10.25. 17:25:14   2013.01.01. 1:12:55
100      2011      223           R         2013.01.01. 1:12:55    3500:12:31. 23:59:59

我想要这样的事情:

CUST_ID EVENT_ID SEGMENT_ID SEGMENT_CODE       DATE_FROM              DATE_TO           DENSE_RANK
100      1424      21            A         2011.01.05. 13:03:12   2011.01.06. 23:40:13       1
100      1566      21            A         2011.01.06. 23:40:13   2011.02.28. 11:48:52       1
100      1580      21            A         2011.02.28. 11:48:52   2012.04.30. 2:49:53        1
100      1601      45            Y         2012.04.30. 2:49:53    2012.05.29. 21:12:27       2
100      1663      45            Y         2012.05.29. 21:12:27   2012.05.30. 11:11:23       2
100      1710      45            Y         2012.05.30. 11:11:23   2012.08.01. 5:14:36        2
100      1875      114           H         2012.08.01. 5:14:36    2012.09.01. 20:26:42       3
100      1880      33            F         2012.09.01. 20:26:42   2012.09.03. 9:12:23        4
100      1901      21            A         2012.09.03. 9:12:23    2012.09.03. 9:12:23        5
100      1903      21            A         2012.09.03. 9:12:23    2012.10.25. 17:25:14       5
100      1966      223           R         2012.10.25. 17:25:14   2013.01.01. 1:12:55        6
100      2011      223           R         2013.01.01. 1:12:55    3500:12:31. 23:59:59       6

您知道我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

根据您的逻辑,dense_rank不会这样做。但是,您可以使用lag()和累积总和获得类似的效果。滞后查看段ID /段代码的上一个日期值,如果它们重叠,则记录不是分组的开始。否则就是。

“isstarts”的累积总和是您正在寻找的:

select t.*,
       sum(case when date_from - prev_date_to < 0.00001
                then 0
                else 1
           end) over (partition by segment_id order by SEGMENT_ID, SEGMENT_CODE
                     ) as YourRanking
from (select t.*,
             lag(date_to) over (partition by SEGMENT_ID, SEGMENT_CODE
                                order by date_from
                               ) as prev_date_to
      from t
     ) t

因为这是日期/时间,所以查询不使用完全相等。相反,它寻找一个小的差异。