问题描述
请原谅我不是创建测试数据而是
=
日期系列的第一行前面没有9行,但是我得到了9个可用行的平均值,其中没有行,因此得到fmp_close。我更喜欢NULL。有什么想法如何在前面的行不存在时返回NULL?
解决方法
您似乎想要:
CASE WHEN ROW_NUMBER() OVER(PARTITION BY SeriesID ORDER BY fmp_date) > 1
THEN AVG(fmp_close) OVER(PARTITION BY SeriesID ORDER BY fmp_date ROWS BETWEEN 9 PRECEDING AND CURRENT ROW)
END AS [10DMA]
这将在每个分区的“第一”行中强制使用null
值(假设对于给定的fmp_date
没有重复的SeriesID
)。
使用窗口min()
可能会更有效率:
CASE WHEN fmp_date > MIN(fmp_date) OVER(PARTITION BY SeriesID)
THEN AVG(fmp_close) OVER(PARTITION BY SeriesID ORDER BY fmp_date ROWS BETWEEN 9 PRECEDING AND CURRENT ROW)
END AS [10DMA]
旁注:请勿将单引号用作标识符-如标准SQL中所指定,它们应仅保留给文字字符串。在数据库中使用相关的标识符引号字符(在TSQL中为方括号)。