如何 select/group User, startdate and max-date before the next the User switch

How to select/group User, startdate and max-date before next the User switch

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

我有一个 table 可以在用户扫描徽章时存储数据。

存储的数据如下:用户名,扫描日期,BadgeNr.

我举个例子:

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

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

是否有可能得到我所期待的?

这是一类gaps-and-islands问题,您可以通过不同的行号来解决:

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);