通过TSQL确定一个月中任意的最新日期?

时间:2012-02-16 02:56:31

标签: sql-server tsql 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

使用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

请注意,这并不像简单地确定“月份的最后一天”或“本月的最后一个工作日”那么简单。

我怀疑我需要使用GROUP BY,HAVING的某种组合,其中包括MAX在datepart(“day”,f1),但我对如何前进感到茫然。有人能把我推向正确的方向吗?

3 个答案:

答案 0 :(得分:5)

假设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;

答案 1 :(得分:3)

正如其他人所指出的,这假设f1的值在你的集合中是不同的。

SELECT
    MaxValues.f1,
    Detail.f2
FROM
    (
    SELECT
        DATEPART(year, f1),
        DATEPART(month, f1),
        MAX(f1) AS f1
    FROM
        MyTable
    GROUP BY
        DATEPART(year, f1),
        DATEPART(month, f1)
    ) AS MaxValues
    INNER JOIN MyTable AS Detail ON
        Detail.f1 = MaxValues.f1

答案 2 :(得分:0)

或更少

SELECT f1, f2 
FROM (SELECT f1, f2, MAX(f1) OVER(PARTITION BY YEAR(f1), MONTH(f1)) AS f3 FROM @t) t
WHERE f1 = f3