T-SQL 第 10 行和当前行之间的行 - 应该 RETURN NULL?

T-SQL ROWS BETWEEN 10 AND CURRENT ROW - SHOULD RETURN NULL?

原谅我没有创建测试数据但是

AVG (fmp_close) OVER(PARTITION BY SeriesID ORDER BY fmp_date ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS '10DMA'

日期系列中的第一行前面没有 9 行,但我得到了 9 个可用行的平均值,其中有 none,所以我得到 fmp_close .我更喜欢 NULL。当前面的行不存在时,如何 return 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 值(假设给定的 SeriesID 没有重复的 fmp_date)。

使用 window 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 中,即方括号)。