【发布时间】:2015-02-24 17:35:14
【问题描述】:
问题:对于包含日期列、任意数量的类别列和值列的给定记录集,我想计算任意日期窗口的值聚合,例如 30 天、365 天等。我查看了窗口聚合函数、CTE 和其他一些函数,但它们似乎(至少对我而言)无法执行所需的功能。
下面的 SQL (T-SQL) 代表了我试图完成的基本思想,但我对它的可伸缩性有一种不好的感觉,尤其是连接,并且一旦我尝试按其他名义组进行分组,难度就会增加。
SELECT
basedate
, count(*) as [n]
, sum(Value) as [SumValue]
, avg(value) As [AverageValue]
, stdev(value) As [StdevValue]
FROM
(SELECT t1.basedate , t2.*
FROM
(SELECT DISTINCT dt as basedate from foo)as t1
,foo as t2
WHERE datediff(d, t1.basedate, t2.dt) between -30 and 0
) t3
GROUP BY t3.basedate
ORDER BY t3.BASEDATE DESC
我创建了一个 SQLFiddle 来尝试使其更具体。
谢谢。
【问题讨论】:
-
您是否按照小提琴的建议使用 SQL-Server 2008?
-
我目前使用的是 SQL-Server 2008,但这可能是未来的 Teradata 查询。
标签: sql query-optimization common-table-expression window-functions