首页 > 解决方案 > 如何在下一次用户切换之前选择/分组用户、开始日期和最大日期

问题描述

很难解释,但我会尽力而为。

当用户扫描徽章时,我有一个存储数据的表。

存储的数据如下:用户名、扫描日期、徽章编号。

我给你举个例子:

SELECT * FROM scan WHERE badgenr = 'B123';

What I start with:

BadgeNr.           Date         User
B123               01-01-2019   MrOne
B123               02-01-2019   MrOne 
B123               03-01-2019   MrTwo
B123               04-01-2019   MrOne 
B123               05-01-2019   MrThree 
B123               06-01-2019   MrThree

What I am trying to get:

BadgeNr.           Date Start          Date End       User
B123               01-01-2019          02-01-2019     MrOne
B123               03-01-2019          03-01-2019     MrTwo
B123               04-01-2019          04-01-2019     MrOne
B123               05-01-2019          06-01-2019     MrThree

如您所见,“日期结束”并不是真正的最大日期,因为我可以使用简单的 group by 和 max(),这很容易......它是下一次用户切换之前的结束日期。

有可能得到我所期待的吗?

标签: sqlsybase

解决方案


这是一种间隙和孤岛问题,您可以通过不同的行号来解决:

select badgenr, user,
       min(date), max(date)
from (select s.*,
             row_number() over (partition by badgenr order by date) as seqnum,
             row_number() over (partition by badgenr, user order by date) as seqnum_u
      from scan s
     ) s
group by badgenr, user, (seqnum - seqnum_u);

推荐阅读