T-SQL行在10和当前行之间-应该返回NULL吗?

问题描述

请原谅我不是创建测试数据而是

=

日期系列的第一行前面没有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中为方括号)。