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

如何在sql中分组并显示最小和最大时间,而不在分组字段上显示不同的结果,sql,group-by,gaps-and-islands,Sql,Group By,Gaps And Islands,我试图超时查看特定字段中的差异,为此,我请求在表中显示特定字段的最短和最长时间。问题是,它向我显示了正在显示的字段的绝对最短和最长时间,但我只希望看到每个连续显示的最短和最长时间 例如,假设我的桌子看起来像: 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 202

我试图超时查看特定字段中的差异,为此,我请求在表中显示特定字段的最短和最长时间。问题是,它向我显示了正在显示的字段的绝对最短和最长时间,但我只希望看到每个连续显示的最短和最长时间

例如,假设我的桌子看起来像:

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
其中显示了绝对最小和最大时间:


如何解决此问题?

添加另一列,例如show\u id,然后按查询

SELECT MIN(Time), MAX(Time), Name, show_id
from table
GROUP BY Name, show_id
ORDER BY MAX(Time) DESC

这是一个缺口和孤岛问题。为此,请使用行号的差值:

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

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

您使用的是哪个引擎?SQL Server、OracleSQL、PostgreSQL等等,。。。?
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);