我有一个由以下代码定义的视图
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个值?
答案 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