如何创建每日显示月度值的视图

时间:2017-07-20 13:58:51

标签: sql sql-server

我有一个由以下代码定义的视图

CREATE VIEW [dbo].V_SOME_VIEW AS
    WITH all_dates AS (SELECT DISTINCT(read_dtime) AS date FROM t_periodic_value),
            theObjects AS (SELECT * FROM t_object)    
    SELECT
        ad.date,
        objs.id, 
        pv1.value as theValue

    FROM all_dates ad
        LEFT JOIN theObjects objs ON
            objs.start_date <= ad.date AND (objs.end_date IS NULL OR (objs.end_date IS NOT NULL AND objs.end_date >= ad.date))
        LEFT JOIN t_periodic_value pv1 ON pv1.data_point_id = (SELECT id FROM t_data_point WHERE object_id = objs.id AND measurement_id = 'MonthlyValue')
            AND pv1.read_dtime = ad.date AND pv1.latest_ind = 1

GO

如果我在任何给定的月份运行一个选择,那么我的输出就是:

Date       |     ID        |    theValue
01/01/1990 |  someFacility |      1000
02/01/1990 |  someFacility |      NULL
03/01/1990 |  someFacility |      NULL
...

以及本月余下的时间。除第一个之外的每个日期都返回空值,因为该值是按月计算的。有没有办法可以定义视图,以便在月中的每隔一天使用第1个值?

1 个答案:

答案 0 :(得分:3)

使用窗口功能:

CREATE VIEW [dbo].V_SOME_VIEW AS
    WITH all_dates AS (
          SELECT DISTINCT(read_dtime) AS date
          FROM t_periodic_value
        ),
        theObjects AS (  -- no idea why you are doing this
         SELECT *
         FROM t_object
        )    
    SELECT ad.date, objs.id, 
           SUM(pv1.value) OVER (PARTITION BY YEAR(ad.date), MONTH(ad.date)) as theValue
    FROM all_dates ad LEFT JOIN
         theObjects objs ON
         ON objs.start_date <= ad.date AND (objs.end_date IS NULL OR (objs.end_date IS NOT NULL AND objs.end_date >= ad.date)) LEFT JOIN
         t_periodic_value pv1
         ON pv1.data_point_id = (SELECT id FROM t_data_point WHERE object_id = objs.id AND measurement_id = 'MonthlyValue')
            AND pv1.read_dtime = ad.date AND pv1.latest_ind = 1

GO
相关问题