Rus*_*her 1 t-sql sql-server sql-server-2000
在我正在使用的每一行数据中,我有一个日期和一个值:
f1 f2
2012-01-01 00:00:00.000 10
2012-01-10 00:00:00.000 9
2012-02-01 00:00:00.000 19
2012-02-15 00:00:00.000 31
Run Code Online (Sandbox Code Playgroud)
使用TSQL,我需要返回包含特定年 - 月组合的最新DAY的每一行 - 例如,在上面的数据中,我需要返回自2012年1月10日开始的第二和第四行"最新"日存储于2012年1月,2012年2月15日是2012年2月记录的最新一天.期望的结果:
f1 f2
2012-01-10 00:00:00.000 9
2012-02-15 00:00:00.000 31
Run Code Online (Sandbox Code Playgroud)
请注意,这并不像简单地确定"月份的最后一天"或"该月的最后一个工作日"那么简单.
我怀疑我需要使用GROUP BY,HAVING的某种组合,其中包括一个MAX在datepart("day",f1),但我对如何前进感到茫然.有人能把我推向正确的方向吗?
假设SQL Server 2005或更好:
DECLARE @t TABLE (f1 DATETIME, f2 INT);
INSERT @t SELECT '2012-01-01',10
UNION ALL SELECT '2012-01-10',9
UNION ALL SELECT '2012-02-01',19
UNION ALL SELECT '2012-02-15',31;
;WITH x AS
(
SELECT f1, f2, ROW_NUMBER() OVER (
PARTITION BY DATEADD(MONTH, DATEDIFF(MONTH, 0, f1), 0)
ORDER BY f1 DESC) AS rn
FROM @t
)
SELECT f1, f2 FROM x
WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)