SQL如何根据日期和用户订购记录的数据?

时间:2015-09-15 22:43:54

标签: sql sql-server-2008

我有一种情况需要根据日期和从历史日志表触及案例的用户创建有序的“事件”或“触摸”排名。例如,我有一个如下所示的日志表:

case_id  user_id  log_date
-------  -------  --------
1        5        06-29 12:05
1        5        06-29 12:10
1        5        06-30 9:12
1        3        06-30 9:15

我希望得到这个:

case_id  user_id  log_date     EventNumber
-------  -------  --------     -----------
1        5        06-29 12:05  1
1        5        06-29 12:10  1
1        5        06-30 9:12   2
1        3        06-30 9:15   3

基本上,日期的更改或触及案例的用户的更改都表示发生了新事件。我到目前为止最接近的是[EventNum] = DENSE_RANK() OVER (PARTITION BY case_id ORDER BY CONVERT(DATE, log_date), user_id)

这种方法的问题在于二级顺序,虽然因为不同的用户触摸它而正确地递增排名,但是会将第二个用户放在第一位,因为user_id恰好是较低的数字。在维护原始记录的订单时,我无法弄清楚用户如何“分区”。即使是日期中断部分也不是必不可少的 - 如果原始记录的订单保持不变,我会解决仅由用户分类的问题。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

这是一个棘手的问题。您需要识别日期用户相邻的组。一种方法是使用lag()。但是,在SQL Server 2008中不可用。另一种方法是使用行号的差异。

差异定义了这个群体。然后,您需要获得最终订购的最短日期。所以:

select t.*,
       dense_rank() over (partition by caseid order by grp_log_date) as EventNum
from (select t.*, min(log_date) over (partition by caseid, grp) as grp_log_date
      from (select t.*,
                   (row_number() over (partition by caseid order by log_date) -
                    row_number() over (partition by caseid, userid, cast(log_date) as date
                                       order by log_date
                                      )
                   ) as grp
            from table t
           ) t
      ) t;