SQL Дата группировки - каждая перестановка - PullRequest
0 голосов
/ 11 марта 2020

В настоящее время есть проблема с несколькими записями, которые определены в окне даты. Некоторые из них windows пересекаются или мульти windows пересекаются. То, что мне нужно сделать, это получить правильную последовательность windows от эффективного и до.

Ниже приведен текущий набор данных:

╔═════╦═══════════════╦═════════════╗
║ Row ║ EffectiveFrom ║ EffectiveTo ║
╠═════╬═══════════════╬═════════════╣
║ 1   ║ 7/12/2010     ║ 15/01/2012  ║
╠═════╬═══════════════╬═════════════╣
║ 2   ║ 1/01/2012     ║ 31/12/2042  ║
╠═════╬═══════════════╬═════════════╣
║ 3   ║ 15/01/2012    ║ 17/04/2012  ║
╠═════╬═══════════════╬═════════════╣
║ 4   ║ 17/04/2012    ║ 15/11/2012  ║
╠═════╬═══════════════╬═════════════╣
║ 5   ║ 15/11/2012    ║ 1/06/2013   ║
╠═════╬═══════════════╬═════════════╣
║ 6   ║ 1/06/2013     ║ 9/09/2013   ║
╠═════╬═══════════════╬═════════════╣
║ 7   ║ 9/09/2013     ║ 21/01/2020  ║
╠═════╬═══════════════╬═════════════╣
║ 8   ║ 23/12/2016    ║ 28/12/2019  ║
╠═════╬═══════════════╬═════════════╣
║ 9   ║ 23/12/2016    ║ 21/02/2020  ║
╠═════╬═══════════════╬═════════════╣
║ 10  ║ 21/01/2020    ║ 1/01/2100   ║
╠═════╬═══════════════╬═════════════╣
║ 11  ║ 21/02/2020    ║ 24/06/2100  ║
╚═════╩═══════════════╩═════════════╝

Требуемый вывод этих данных как следует:

╔═══════════╦═══════════════╦═════════════╗
║ Row       ║ EffectiveFrom ║ EffectiveTo ║
╠═══════════╬═══════════════╬═════════════╣
║ 1         ║ 7/12/2010     ║ 1/01/2012   ║
╠═══════════╬═══════════════╬═════════════╣
║ 1,2       ║ 1/01/2012     ║ 15/01/2012  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,3       ║ 15/01/2012    ║ 17/04/2012  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,4       ║ 17/04/2012    ║ 15/11/2012  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,5       ║ 15/11/2012    ║ 1/06/2013   ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,6       ║ 1/06/2013     ║ 9/09/2013   ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,7       ║ 9/09/2013     ║ 23/12/2016  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,7,8,9   ║ 23/12/2016    ║ 28/12/2019  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,7,9     ║ 28/12/2019    ║ 21/01/2020  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,9,10    ║ 21/01/2020    ║ 21/02/2020  ║
╠═══════════╬═══════════════╬═════════════╣
║ 2,9,10,11 ║ 21/02/2020    ║ 31/12/2042  ║
╠═══════════╬═══════════════╬═════════════╣
║ 9,10,11   ║ 31/12/2042    ║ 1/01/2100   ║
╠═══════════╬═══════════════╬═════════════╣
║ 11        ║ 1/01/2100     ║ 24/06/2100  ║
╚═══════════╩═══════════════╩═════════════╝

К сожалению, мой мозг, похоже, исчерпал свои ограничения в выяснении, как подойти к этому в SQL

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Я закончил тем, что сделал следующее:

SELECT 
    ROW_NUMBER() OVER (ORDER BY RDate) AS 'DateRow',
    * 
    INTO #Windows FROM (
    SELECT EffectiveFrom    AS 'RDate'
    FROM #Windows
    UNION 
    SELECT EffectiveTo      AS 'RDate'
FROM #Windows) [Windows]

После того, как я построил и упорядочил все правильно, я сделал следующее:

SELECT 
    [StartDate].RDate                                   AS 'Start',
    [EndDate].RDate                                     AS 'End'
FROM #Windows [StartDate]
    LEFT JOIN #Windows [EndDate] ON [StartDate].DateRow = [EndDate].DateRow - 1

Казалось, что все работает хорошо и дал мне ожидаемые результаты.

0 голосов
/ 11 марта 2020

Вы можете сгенерировать временные рамки, а затем использовать коррелированный подзапрос или боковое соединение:

with dates as (
      select v.dte as fromdate,
             lead(v.dte) over (order by v.dte) as todate
      from t cross apply
           (values (effdate), (enddate)
           ) v(dte) 
      group by v.dte
     )
select t.rows, d.*
from dates cross apply
     (select string_agg(row, ',') as rows
      from t
      where dates.fromdate < t.enddate and
            dates.todate >= t.effdate
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...