Как сгруппировать данные в диапазоне допустимых временных отметок - PullRequest
1 голос
/ 03 ноября 2019

У меня есть таблица, состоящая из строк данных, собранных в процессе недетерминированного опроса. Каждая строка имеет начальную и конечную временные метки, обозначающие период времени, в течение которого были собраны данные. В некоторых случаях данные собирались непрерывно, и в этом случае временная метка одной строки будет иметь то же значение, что и начальная временная метка для следующей строки. В других случаях существует разрыв во времени между одним рядом и следующим.

Например, в таблице ниже строки с номерами 1,2,3 и 4 являются частью одного временного ряда данных. Аналогично для строк 5, 6, 7 и 8 и снова для строк 9 и 10. Между ними есть периоды времени, для которых у меня нет данных.

Row  Start_Timestamp      End_Timestamp           Data_Item
---  ---------------      --------------          ---------
1    2019-08-12_22:07:53  2019-08-12_22:09:57     100      
2    2019-08-12_22:09:57  2019-08-12_22:12:01     203      
3    2019-08-12_22:12:01  2019-08-12_22:13:03     487      
4    2019-08-12_22:13:03  2019-08-12_22:16:19     113      
5    2019-08-12_22:24:34  2019-08-12_22:26:37     632      
6    2019-08-12_22:26:37  2019-08-12_22:27:40     532      
7    2019-08-12_22:27:40  2019-08-12_22:28:42     543      
8    2019-08-12_22:28:42  2019-08-12_22:31:57     142      
9    2019-08-13_19:56:06  2019-08-13_19:57:08     351      
10   2019-08-13_19:57:08  2019-08-13_19:58:10     982      

Я хотел бы в идеале сгруппировать эти непрерывные временные ряды следующим образом:

Row  Series  Start_Timestamp      End_Timestamp           Data_Item   
---  ------  ---------------      --------------          -----------  
1    1       2019-08-12_22:07:53  2019-08-12_22:09:57     100
2    1       2019-08-12_22:09:57  2019-08-12_22:12:01     203
3    1       2019-08-12_22:12:01  2019-08-12_22:13:03     487
4    1       2019-08-12_22:13:03  2019-08-12_22:16:19     113
5    2       2019-08-12_22:24:34  2019-08-12_22:26:37     632
6    2       2019-08-12_22:26:37  2019-08-12_22:27:40     532
7    2       2019-08-12_22:27:40  2019-08-12_22:28:42     543
8    2       2019-08-12_22:28:42  2019-08-12_22:31:57     142
9    3       2019-08-13_19:56:06  2019-08-13_19:57:08     351
10   3       2019-08-13_19:57:08  2019-08-13_19:58:10     982

Я новичок в SQL и борюсь с этой проблемой. Я ценю любые идеи или советы о том, как мне этого добиться.

1 Ответ

1 голос
/ 03 ноября 2019

Это упрощенная проблема пробелов и островов. Предполагая, что ваша СУБД поддерживает оконные функции, вы можете подойти к этому с помощью оконной суммы. Когда Start_Timestamp записи отличается от End_Timestamp предыдущей записи, начинается новая группа:

select
    t.Row,
    sum(case when Start_Timestamp = lag_End_Timestamp then 0 else 1 end) 
        over(order by End_Timestamp) series,
    t.Start_Timestamp,
    t.End_Timestamp,
    t.Data_Item
from (
    select
        t.*,
        lag(End_Timestamp) over (order by End_Timestamp) lag_End_Timestamp
    from mytable t
) t

Демонстрация на DB Fiddle :

Row | series | Start_Timestamp     | End_Timestamp       | Data_Item
--: | -----: | :------------------ | :------------------ | --------:
  1 |      1 | 2019-08-12 22:07:53 | 2019-08-12 22:09:57 |       100
  2 |      1 | 2019-08-12 22:09:57 | 2019-08-12 22:12:01 |       203
  3 |      1 | 2019-08-12 22:12:01 | 2019-08-12 22:13:03 |       487
  4 |      1 | 2019-08-12 22:13:03 | 2019-08-12 22:16:19 |       113
  5 |      2 | 2019-08-12 22:24:34 | 2019-08-12 22:26:37 |       632
  6 |      2 | 2019-08-12 22:26:37 | 2019-08-12 22:27:40 |       532
  7 |      2 | 2019-08-12 22:27:40 | 2019-08-12 22:28:42 |       543
  8 |      2 | 2019-08-12 22:28:42 | 2019-08-12 22:31:57 |       142
  9 |      3 | 2019-08-13 19:56:06 | 2019-08-13 19:57:08 |       351
 10 |      3 | 2019-08-13 19:57:08 | 2019-08-13 19:58:10 |       982
...