【问题标题】:How to group in sql and show min and max time without showing distinct result on the grouped field如何在 sql 中分组并显示最小和最大时间而不在​​分组字段上显示不同的结果
【发布时间】:2020-05-07 07:09:01
【问题描述】:

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

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

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 Server、OracleSQL、PostgreSQL、...?

标签: sql group-by gaps-and-islands


【解决方案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);

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-21
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2013-05-28
      • 2012-01-19
      相关资源
      最近更新 更多