SQL свернуть данные - PullRequest
       9

SQL свернуть данные

0 голосов
/ 11 июня 2018

Я пытаюсь свернуть данные в последовательности, отсортированной по дате.При группировании по человеку и типу.

Данные хранятся на сервере SQL и выглядят следующим образом -

seq  person  date                 type
---  ------  -------------------  ----
1    1       2018-02-10 08:00:00  1
2    1       2018-02-11 08:00:00  1
3    1       2018-02-12 08:00:00  1
4    1       2018-02-14 16:00:00  1
5    1       2018-02-15 16:00:00  1
6    1       2018-02-16 16:00:00  1
7    1       2018-02-20 08:00:00  2
8    1       2018-02-21 08:00:00  2
9    1       2018-02-22 08:00:00  2
10   1       2018-02-23 08:00:00  1
11   1       2018-02-24 08:00:00  1
12   1       2018-02-25 08:00:00  2
13   2       2018-02-10 08:00:00  1
14   2       2018-02-11 08:00:00  1
15   2       2018-02-12 08:00:00  1
16   2       2018-02-14 16:00:00  3
17   2       2018-02-15 16:00:00  3
18   2       2018-02-16 16:00:00  3

Этот набор данных содержит около 1,2 миллиона записей, которые похожи на приведенные выше..

Результат, который я хотел бы получить из этого, был бы -

person  start                type
------  -------------------  ----
1       2018-02-10 08:00:00  1
1       2018-02-20 08:00:00  2
1       2018-02-23 08:00:00  1
1       2018-02-25 08:00:00  2
2       2018-02-10 08:00:00  1
2       2018-02-14 16:00:00  3

У меня есть данные в первом формате, выполнив следующий запрос -

select 
  ROW_NUMBER() OVER (ORDER BY date) AS seq 
  person, 
  date, 
  type, 
from table
group by person, date, type   

Я просто не уверен, как сохранить минимальную дату с другими отличными значениями от лица и типа.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Правильное решение с использованием разности номеров строк:

select person, type, min(date) as start
from (select t.*, 
             row_number() over (partition by person order by seq) as seqnum_p,
             row_number() over (partition by person, type order by seq) as seqnum_pt
      from t
     ) t
group by person, type, (seqnum_p - seqnum_pt)
order by person, start;

type необходимо включить в GROUP BY.

0 голосов
/ 11 июня 2018

Это проблема пробелов и островков, поэтому вы можете использовать различия row_number() и использовать их при группировании:

select person, min(date) as start, type
from (select *, 
              row_number() over (partition by person order by seq) seq1,
              row_number() over (partition by person, type order by seq) seq2
      from table
     ) t
group by person, type, (seq1 - seq2)
order by person, start;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...