Как сгруппировать в sql и показать минимальное и максимальное время, не показывая отчетливый результат в сгруппированном поле - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь просмотреть различия в определенных c полях сверхурочно, и для этого я запрашиваю минимальное и максимальное время, в течение которого поле c было показано в таблице. Проблема в том, что он показывает мне абсолютное минимальное и максимальное время отображения поля, но я sh, чтобы видеть только минимальное и максимальное время каждого последовательного показа.

Например, допустим, моя таблица выглядит так:

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

, который показывает абсолютное минимальное и максимальное время: (

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Это проблема промежутков и островов. Для этого используйте разницу номеров строк:

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 голосов
/ 07 мая 2020

Добавьте еще один столбец, скажем «show_id», а затем запросите

SELECT MIN(Time), MAX(Time), Name, show_id
from table
GROUP BY Name, show_id
ORDER BY MAX(Time) DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...