2017-09-06 70 views
1

我想加入一个子查询中的最大日期,但我得到一个错误。即时通讯使用SQL ServerMAX日期子查询SQL Server

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] 
       ) 

但我得到一个错误:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

回答

0

你忘了你在你的子查询指定别名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] 
       ) 
0

的问题是在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] 
); 
0

你应该写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