使用SQL Server 2016
我有以下T-SQL查询,它能够完成我需要的功能,但是它包含了很多重复内容。有没有更优雅的方式来重写它?
SELECT z.*
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [action_timestamp] DESC) AS rowNum,
[new_state] AS [Last_State],
DATEADD(MONTH, 0, @date) AS [date]
FROM [dbo].[CR_hist_Data]
WHERE [action_timestamp_formatted] < DATEADD(MONTH, -1, @date)
) z
WHERE z.rowNum = 1
UNION
SELECT z.*
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [action_timestamp] DESC) AS rowNum,
[new_state] AS [Last_State],
DATEADD(MONTH, -1, @date) AS [date]
FROM [dbo].[CR_hist_Data]
WHERE [action_timestamp_formatted] < DATEADD(MONTH, -2, @date)
) z
WHERE z.rowNum = 1
UNION
SELECT z.*
FROM
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [action_timestamp] DESC) AS rowNum,
[new_state] AS [Last_State],
DATEADD(MONTH, -2, @date) AS [date]
FROM [dbo].[CR_hist_Data]
WHERE [action_timestamp_formatted] < DATEADD(MONTH, -3, @date)
) z
WHERE z.rowNum = 1;
etc....for 12 times
如您所见,我正在使用一个月的日期偏移量将相同的语句 UNION 12 次。 请给予建议。 谢谢。
OVER
和它的ROWS
子句来限制你想要应用聚合或函数的行数来解决这个问题。 - S3S