查找每月最接近月末的日期

时间:2016-05-07 09:11:32

标签: sql sql-server-2008 date max

在表格中我有一个字段,其中包含日期格式为dd / mm / yyyy:

TBL_Metrics:
DATE | MetricValue
03/02/2015 | 99.1%
04/02/2015 | 97.3%
03/03/2015 | 94.5%
29/03/2015 | 93.6%
07/04/2015 | 43.9%
30/04/2015 | 94.2%
...

我想构建一个可以查看所有这些日期的SQL代码:

  1. 检测日期月份
  2. 在每个月内,查找最接近月末的日期 (在上面的一个非常简短的例子中,2月到月底的最近日期是2015年2月4日)
  3. 在选择查询中重复使用最接近月末的日期:
  4.   

    选择TBL_Metrics.Date,TBL_Metrics.MetricValue        来自TBL_Metrics        在哪里TBL_Metrics.Date(' 04/02 / 2015',' 29/03 / 2015',' 30/04 / 2015')

    我不知道如何在sql中执行此操作,目前我在VBA中执行此操作但它迫使我有一个带有数据库连接的虚拟电子表格,首先检索所有日期,然后在所有日期循环以查找最接近月末的日期然后我可以构建我的查询以在另一个spreqdsheet中使用,这很麻烦。

    在这里给你一个想法是我如何找到vba中最接近月末的日期:

    dat1month = January
    dat2month = February
    dat3month = March
    For i = 2 To LR
        If MonthName(Month(ActiveSheet.Cells(i, 3))) = dat1month Then
            If ActiveSheet.Cells(i, 3) > Dat1max Then
                Dat1max = ActiveSheet.Cells(i, 3)
            End If
        ElseIf MonthName(Month(ActiveSheet.Cells(i, 3))) = dat2month Then
            If ActiveSheet.Cells(i, 3) > Dat2max Then
                Dat2max = ActiveSheet.Cells(i, 3)
            End If
        ElseIf MonthName(Month(ActiveSheet.Cells(i, 3))) = dat3month Then
            If ActiveSheet.Cells(i, 3) > Dat3max Then
                Dat3max = ActiveSheet.Cells(i, 3)
            End If
        End If
    Next i
    

    我希望有人可以提供帮助! 非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以使用cte添加row number列,以帮助查找到月末的最近一天,然后查询该cte:

;With cte as
(
  SELECT Date, MetricValue, ROW_NUMBER() OVER(PARTITION BY YEAR(Date), MONTH(Date) ORDER BY Day(Date) DESC) rn
  FROM TBL_Metrics
)

SELECT Date, MetricValue
FROM cte 
WHERE rn = 1

答案 1 :(得分:0)

如果我正确地阅读了您的问题,我认为您可以使用SQL排名函数ROW_NUMBER来帮助,就像这样......

SELECT  Date ,
        MetricValue
FROM    (
            SELECT  Date ,
                    MetricValue ,
                    ROW_NUMBER() OVER PARTITION BY (YEAR(Date), MONTH(Date) ORDER BY Date DESC)
            FROM    TBL_Metrics
        ) x