sql - 如何在下一次用户切换之前选择/分组用户、开始日期和最大日期
问题描述
很难解释,但我会尽力而为。
当用户扫描徽章时,我有一个存储数据的表。
存储的数据如下:用户名、扫描日期、徽章编号。
我给你举个例子:
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(),这很容易......它是下一次用户切换之前的结束日期。
有可能得到我所期待的吗?
解决方案
这是一种间隙和孤岛问题,您可以通过不同的行号来解决:
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);
推荐阅读
- ios - 从 Swift 3 更新项目时的便利初始化错误
- azure-api-management - Azure API 管理在 API 终结点级别限制多个调用方 IP 地址 API
- android - 我正在开发用于跟踪用户活动的应用程序。我每隔 5 秒将他的 latlngs 存储到 db 中,稍后我想向用户展示他走过的路线
- java - 如何将 JAAS-J2C 身份验证数据从 Websphere 迁移到 Liberty
- javascript - 如何按分钟循环两个 DateTime?JavaScript
- javascript - 当 return new Promise((resolve, reject) => {}) 忘记调用resolve或reject时会发生什么?
- bash - 需要执行。./setantenv.sh 在 shell 脚本中为 SAP commerce 设置 ant 环境变量
- java - 在java中将部分hashmap重复合并到新的arraylist
- php - 根据 if 条件使用 use 关键字
- spring-boot - spring security 身份验证和资源服务器分离的 check_token 未发送授权标头(outh2 jwt spring boot,zuul)