我正在尝试查看特定字段在超时方面的差异,为此,我要求在表中显示该特定字段的最短和最长时间。问题在于,它向我显示了所显示字段的绝对最小和最大时间,但我希望仅看到每个连续显示的最小和最大时间。
例如,假设我的表格如下:
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);
这是如何工作的,很难解释。如果查看子查询的结果,您将看到如何通过行号的差异来定义所需的相邻行。
添加另一列,说“ show_id”,然后查询依据
SELECT MIN(Time), MAX(Time), Name, show_id
from table
GROUP BY Name, show_id
ORDER BY MAX(Time) DESC