如何 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);
很难解释,但我会尽力而为。
我有一个 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);