Восстановить исторические данные - PullRequest
0 голосов
/ 09 июля 2019

У меня есть историческая таблица, подобная этой:

+------------------+------------------+---------+-------+
| valid_from       | valid_to         |  Profit | ID    |
+------------------+------------------+---------+-------+
| 20.05.2019 00:02 | 22.05.2019 23:42 |      10 | 12345 |
| 22.05.2019 23:42 | 28.05.2019 13:11 |      10 | 12345 |
| 28.05.2019 13:11 | 28.05.2019 23:59 |      10 | 12345 |
| 28.05.2019 23:59 | 29.05.2019 06:48 |     123 | 12345 |
| 29.05.2019 06:48 | 29.05.2019 13:21 |     123 | 12345 |
| 29.05.2019 13:21 | 29.05.2019 23:59 |     123 | 12345 |
| 29.05.2019 23:59 | 30.05.2019 06:39 |      10 | 12345 |
| 30.05.2019 06:39 | 30.05.2019 12:37 |     123 | 12345 |
| 30.05.2019 12:37 | 31.05.2019 00:09 |     123 | 12345 |
| 31.05.2019 00:09 | 31.05.2019 08:41 |     145 | 12345 |
| 31.05.2019 08:41 | 01.06.2019 00:22 |     145 | 12345 |
+------------------+------------------+---------+-------+

Я удалил несколько столбцов.Строки 1, 2 и 3 теперь можно суммировать.

Сначала я попробовал следующее выражение GROUP-BY:

SELECT MIN(valid_from   ) AS valid_from 
      ,MAX(valid_to ) AS valid_to   
      ,Profit
      ,ID
INTO [repaired_archiv]
FROM temp.[wrong_archiv]
GROUP BY Profit
        ,ID

Результат:

+------------------+------------------+---------+-------+
| valid_from       | valid_to         |  Profit | ID    |
+------------------+------------------+---------+-------+
| 20.05.2019 00:02 | 30.05.2019 06:39 |      10 | 12345 |
| 28.05.2019 23:59 | 31.05.2019 00:09 |     123 | 12345 |
| 31.05.2019 00:09 | 01.06.2019 00:22 |     145 | 12345 |
+------------------+------------------+---------+-------+

, нокак видите, столбец valid_to в первой строке не так.Причиной этого является неправильное утверждение GROUP-BY.Я не знаю, как получить мой предполагаемый результат, как это:

+------------------+------------------+---------+-------+
| valid_from       | valid_to         |  Profit | ID    |
+------------------+------------------+---------+-------+
| 20.05.2019 00:02 | 28.05.2019 23:59 |      10 | 12345 |
| 28.05.2019 23:59 | 29.05.2019 23:59 |     123 | 12345 |
| 29.05.2019 23:59 | 30.05.2019 06:39 |      10 | 12345 |
| 30.05.2019 06:39 | 31.05.2019 00:09 |     123 | 12345 |
| 31.05.2019 00:09 | 01.06.2019 00:22 |     145 | 12345 |
+------------------+------------------+---------+-------+

1 Ответ

2 голосов
/ 09 июля 2019

Вам нужно два row_number():

select min(valid_from) as valid_from, max(valid_to) as valid_to, id, profit
from (select t.*, 
             row_number() over (order by valid_from) as seq1,
             row_number() over (partition by id, profit order by valid_from) as seq2
      from temp.[wrong_archiv] t
     ) t
group by id, profit, (seq1 - seq2)
order by valid_from;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...