如何在sql中分组并显示最小和最大时间,而不在分组字段上显示不同的结果

问题描述 投票:0回答:2

我正在尝试查看特定字段在超时方面的差异,为此,我要求在表中显示该特定字段的最短和最长时间。问题在于,它向我显示了所显示字段的绝对最小和最大时间,但我希望仅看到每个连续显示的最小和最大时间。

例如,假设我的表格如下:

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

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

我该如何解决?

sql group-by gaps-and-islands
2个回答
1
投票

这是一个孤岛问题。为此,请使用行号的不同之处:

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

这是如何工作的,很难解释。如果查看子查询的结果,您将看到如何通过行号的差异来定义所需的相邻行。


0
投票

添加另一列,说“ show_id”,然后查询依据

SELECT MIN(Time), MAX(Time), Name, show_id
from table
GROUP BY Name, show_id
ORDER BY MAX(Time) DESC
© www.soinside.com 2019 - 2024. All rights reserved.