SQL Server的最大日期子查询
我试图在子查询中加入最大日期,但出现错误。我正在使用SQL serverSQL Server的最大日期子查询,sql,sql-server,group-by,Sql,Sql Server,Group By,我试图在子查询中加入最大日期,但出现错误。我正在使用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 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子句或select列表中包含的子查询中,并且被聚合的列是外部引用
您忘记了在子查询中指定的别名Z。如果在子查询中使用评估,则他会考虑来自外部查询的评估,因为评估在子查询中的名称为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]
)
您忘记了在子查询中指定的别名Z。如果在子查询中使用评估,则他会考虑来自外部查询的评估,因为评估在子查询中的名称为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]
)
问题在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]
);
问题在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]
);
您应该将MAXCASTZ.[Assessment Date]写为datetime,而不是将MAXCASTAssessment.[Assessment Date]写为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])
您还可以重写它,以用于为每个评估选择最近的行:
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
您应该将MAXCASTZ.[Assessment Date]写为datetime,而不是将MAXCASTAssessment.[Assessment Date]写为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])
您还可以重写它,以用于为每个评估选择最近的行:
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