SQL условное агрегирование с течением времени - PullRequest
0 голосов
/ 19 октября 2018

В целях отчетности я изо всех сил пытаюсь получить некоторые таблицы в формате, который можно легко сгруппировать и агрегировать в инструменте отчетов (SSRS).

Я использую SQL Server 2014

Iиметь следующие таблицы: (для примера показаны даты, но на самом деле это даты и времени)

tblEvents

datetimestamp       prio
----------------------------------
2018-05-20          4
2018-08-05          1 
2018-11-12          3
2018-11-13          1

Который нужно «пересэмплировать» в tblCalendar, который представляет собой таблицу интервалов с равным интервалом с настраиваемым значением @start_datetime,@end_date, @number_of_intervals, которые мне уже удалось сделать с помощью CTE:

tblCalendar

datefrom        dateto      
----------------------------------
1900-01-01      2018-04-12  
2018-04-12      2018-05-31  
2018-05-31      2018-07-19
2018-07-19      2018-09-06   
2018-09-06      2018-10-25
2018-10-25      2018-12-13
2018-12-13      2100-01-01

Желаемый результат:

datefrom        dateto      prio
-------------------------------------------
1900-01-01      2018-04-12     -1
2018-04-12      2018-05-31     4     
2018-05-31      2018-07-19     4    
2018-07-19      2018-09-06     1 
2018-09-06      2018-10-25     1    
2018-10-25      2018-12-13     3
2018-12-13      2100-01-01     3  

Для каждой строки tblCalendar столбец prio должен бытьдобавить согласно:

   IF between [datefrom] en [dateto] 1 or more datetimestamp present in tblEvents

        take MAXIMUM of prio's between [datefrom] en [dateto]

    ELSE
        IF before [date1]  1 or more datetimestamp present in tblEvents

            take LAST prio between [datefrom] en [dateto]

        ELSE

            IF after [date2] 1 or more datetimestamp present

                take FIRST prio between [datefrom] en [dateto]

            ELSE

                prio unknown = -1

            END
        END
    END

Так что я бы описал проблему как условную агрегацию.

Я довольно новичок в SQL и пытался исправить это с помощью подзапросов, условных объединений и т. Д., Но не могу заставить его работать.Код ниже моя текущая попытка.

SELECT
    datefrom,
    dateto,
    MAX(Case 
            When ((datetimestamp >= datefrom)  AND (datetimestamp <= dateto)) Then prio
            When ((datetimestamp <= datefrom)) Then 'last-known-prio'
            When ((datetimestamp >  dateto)) Then 'first future-prio'                       
            Else    
                -1  -- no prio known ever                                                   
            End),

FROM   tblCalendar CROSS JOIN tblEvents     

Буду признателен за любую помощь и мысли.

1 Ответ

0 голосов
/ 19 октября 2018

Это не условное агрегирование.

Это простой выбор из вашего tblCalendar, а затем CUBSELECT на основе CASE для получения значения prio.

psuedocode:

SELECT
    datefrom,
    dateto,
    CASE 
        WHEN {between [datefrom] en [dateto] 1 or more datetimestamp present in tblEvents}
          THEN (SELECT {MAXIMUM of prio's between [datefrom] en [dateto]})
        WHEN {before [date1]  1 or more datetimestamp present in tblEvents}
          THEN (SELECT {LAST prio between [datefrom] en [dateto]})
        WHEN {after [date2] 1 or more datetimestamp present}
          THEN (SELECT {FIRST prio between [datefrom] en [dateto]})
        ELSE -1
    END as prio
FROM   tblCalendar

И могут быть другие синтаксические опции с CROSS APPLY и т. Д., Но это способ думать об этой проблеме.

...