【问题标题】:Find closest date to month end for each month查找每个月最接近月底的日期
【发布时间】:2016-09-02 08:53:19
【问题描述】:

在表格中,我有一个包含日期的字段,格式为 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 月最接近月底的日期是 04/02/2015)
  3. 在选择查询中重复使用最接近月底的日期:

选择 TBL_Metrics.Date、TBL_Metrics.MetricValue FROM TBL_Metrics WHERE TBL_Metrics.Date in ('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

希望有人能帮忙! 非常感谢!

【问题讨论】:

  • 请编辑您的问题以包括相关表的 DDL、一些示例数据(最好是 DML 语句)和所需的输出。
  • 嗨 Zohar,抱歉,希望现在更清楚了

标签: sql sql-server-2008 date max


【解决方案1】:

如果我没看错你的问题,我想你可以使用 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

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2020-10-30
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多