随着时间的SQL条件聚合

时间:2018-10-19 11:57:18

标签: sql-server aggregation

出于报告目的,我正在努力以可轻松在报告工具(SSRS)中进行分组和汇总的格式来获取一些表格。

我使用SQL Server 2014

我有下表: (示例中显示了日期,但实际上是日期时间)

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 :(得分:0)

这不是条件聚合。

这是从您的tblCalendar中进行的简单选择,然后是基于CASE的SUBSELECT即可获得prio的值。

伪代码:

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等可能还有其他语法选项,但这是思考此问题的方法。