首页 > 解决方案 > 如何在 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

其中显示,绝对最小和最大时间:(

我怎样才能解决这个问题?

标签: sqlgroup-bygaps-and-islands

解决方案


这是一个差距和孤岛问题。为此,使用行号的差异:

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

这是如何工作的有点难以解释。如果您查看子查询的结果,您将看到您想要的相邻行是如何由行号的差异定义的。


推荐阅读