【问题标题】:MAX Date Subquery SQL ServerMAX 日期子查询 SQL Server
【发布时间】:2018-02-14 14:50:42
【问题描述】:

我正在尝试在子查询中加入最大日期,但出现错误。我正在使用 SQL 服务器

SELECT Headcount.[Snapshot Date]
, Headcount.[ID]
, Assessment.[Assessment Date]
, Assessment.[Code]

FROM Headcount INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
WHERE Assessment.[Assessment Date] = 
                 (SELECT MAX(CAST(Assessment.[Assessment Date] as datetime)) 
                  FROM Assessmnet AS Z 
                  WHERE Z.[ID] = Assessment.[ID] 
                       AND Assessment.[Assessment Date] <= Headcount.[Snapshot Date]
                 )

但我得到一个错误:

聚合可能不会出现在 WHERE 子句中,除非它出现在 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案1】:

    您忘记了在子查询中指定的别名 Z。如果您在子查询中使用Assessment,那么他会考虑来自外部查询的Assessment,因为Assessment 在您的子查询中具有名称Z

    SELECT Headcount.[Snapshot Date]
    , Headcount.[ID]
    , Assessment.[Assessment Date]
    , Assessment.[Code]
    
    FROM Headcount INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
    WHERE Assessment.[Assessment Date] = 
                     (SELECT MAX(CAST(Z.[Assessment Date] as datetime)) 
                      FROM Assessment AS Z 
                      WHERE Z.[ID] = Assessment.[ID] 
                           AND Z.[Assessment Date] <= Headcount.[Snapshot Date]
                     )
    

    【讨论】:

      【解决方案2】:

      问题出在where 条件的子查询中,请尝试以下操作:

      SELECT
          Headcount.[Snapshot Date],
          Headcount.[ID],
          Assessment.[Assessment Date],
          Assessment.[Code]
      FROM Headcount
      INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
      WHERE Assessment.[Assessment Date] =
      (
          SELECT
              MAX(CAST(Assessment.[Assessment Date] AS DATETIME))
          FROM Assessmnet AS Z
          GROUP BY
              Z.ID
          HAVING Z.[ID] = Assessment.[ID]
                 AND Assessment.[Assessment Date] <= Headcount.[Snapshot Date]
      );
      

      【讨论】:

        【解决方案3】:

        你应该写MAX(CAST(Z.[Assessment Date] as datetime))而不是MAX(CAST(Assessment.[Assessment Date] as datetime))。否则,您将在错误的表中进行聚合。

        以下查询可能有效(未经测试!):

        SELECT Headcount.[Snapshot Date]
        , Headcount.[ID]
        , Assessment.[Assessment Date]
        , Assessment.[Code]
        FROM Headcount
        INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
        WHERE Assessment.[Assessment Date] =
                         (SELECT MAX(CAST(Z.[Assessment Date] as datetime))
                          FROM Assessment AS Z
                          WHERE Z.[ID] = Assessment.[ID] 
                            AND Z.[Assessment Date] <= Headcount.[Snapshot Date])
        

        您也可以重写它以使用ROW_NUMBER 为每个评估选择最近的一行:

        SELECT [Snapshot Date], [ID], [Assessment Date], [Code]
        FROM (SELECT [Snapshot Date], [ID], [Assessment Date], [Code],
                ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [Assessment Date] DESC) rn
              FROM Headcount JOIN Assessment USING ([ID])
              WHERE [Assessment Date] <= [Snapshot Date]) t
        WHERE rn = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-29
          • 2020-10-07
          • 1970-01-01
          • 2019-12-06
          • 2010-11-13
          相关资源
          最近更新 更多