sql - 如何在 sql 中分组并显示最小和最大时间而不在分组字段上显示不同的结果
问题描述
我正在尝试超时查看特定字段的差异,为此我请求特定字段在表中显示的最短和最长时间。问题是它向我显示了显示字段的绝对最小和最大时间,但我希望只看到每个连续节目的最小和最大时间。
例如,假设我的表如下所示:
Time | Name
2020-04-17 06:00:15 | John
2020-04-18 12:00:15 | John
2020-04-19 06:00:15 | Jackson
2020-04-19 08:00:15 | Jackson
2020-04-19 16:00:15 | Jackson
2020-04-19 20:00:15 | John
2020-04-20 06:00:15 | John
2020-04-21 06:00:15 | Jackson
2020-04-22 06:00:15 | Jackson
我想要的结果是:
Min(Time) Max(Time) Name
2020-04-17 06:00:15 2020-04-18 12:00:15 John
2020-04-19 06:00:15 2020-04-16 06:00:15 Jackson
2020-04-19 20:00:15 2020-04-20 06:00:15 John
2020-04-21 06:00:15 2020-04-22 06:00:15 Jackson
但是我使用 SQL 查询得到的结果是:
SELECT MIN(Time), MAX(Time), Name
from table
GROUP BY Name
ORDER BY MAX(Time) DESC
Min(Time) Max(Time) Name
2020-04-17 06:00:15 2020-04-20 06:00:15 John
2020-04-19 06:00:15 2020-04-22 06:00:15 Jackson
其中显示,绝对最小和最大时间:(
我怎样才能解决这个问题?
解决方案
这是一个差距和孤岛问题。为此,使用行号的差异:
select name, min(time), max(time)
from (select t.*,
row_number() over (order by time) as seqnum,
row_number() over (partition by name order by time) as seqnum_n
from t
) t
group by name, (seqnum - seqnum_n);
这是如何工作的有点难以解释。如果您查看子查询的结果,您将看到您想要的相邻行是如何由行号的差异定义的。
推荐阅读
- php - 如何在 CakePHP 中配置会话生命周期仅持续 24 小时?
- swift - path(in:) 未按预期顺序调用
- c# - C# HTTP 错误 413.1 - 请求实体太大 - 无法正常处理此错误
- asp.net - Asp 面板可见是真的,但面板不显示
- sequelize.js - Sequelize 关联属于不正确的外键
- google-cloud-platform - 为什么在尝试编辑 Google Cloud 函数时“下一步”按钮显示为灰色?
- c - 我无法弄清楚这个用 c 编写的链表代码的问题
- python - 如何计算抛硬币的p值?
- angular - 订阅功能的单元测试
- node.js - 安装和打开节点红色的问题