我对填充的Table变量有以下查询,该变量应该返回行或每个最近的日期:
SELECT t.ID
,t.Column_2
,t.MaxDate AS [End Date Time]
,t.Column_3
,t.Column_4
,t.Column_5
FROM (
SELECT ID
,Column_2
,MAX(EndDateTime) AS MaxDate
,Column_3
,Column_4
,Column_5
FROM @MyTable
GROUP BY Column_2
) t
INNER JOIN @MyTable o ON t.ID = o.ID
AND t.MaxDate = o.EndDateTime
我一直收到错误:Column '@MyTable.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
不确定问题是什么,因为我在内部select语句中包含了一个GROUP BY子句,我是否还需要一个outter select查询?另外,如何在最终返回结果中将其修改为ORDER BY EndDateTime DESC
?提前谢谢。
更新:
感谢大家的反馈,我纠正了错误并学到了新的东西。感谢。
答案 0 :(得分:3)
您需要在select语句中汇总MAX(), MIN(), AVG()
或GROUP BY
EVERY 字段。
您没有导致问题的GROUP
或汇总ID, Column_3 - Column_5
。
答案 1 :(得分:1)
您需要包含未汇总的所有列。我认为你应该做到以下几点:
SELECT o.ID
,o.Column_2
,t.MaxDate AS [End Date Time]
,o.Column_3
,o.Column_4
,o.Column_5
FROM (
SELECT ID
,MAX(EndDateTime) AS MaxDate
FROM @MyTable
GROUP BY ID
) t
INNER JOIN @MyTable o ON t.ID = o.ID
AND t.MaxDate = o.EndDateTime
答案 2 :(得分:0)
错误来自最里面的SELECT
查询。它告诉您,您不能在一列上应用聚合字段,按第二列分组,然后对另一列不执行任何操作4.尝试相反(结果可能会有所不同,具体取决于您实际尝试生成的内容)结果):
SELECT t.ID
,t.Column_2
,t.MaxDate AS [End Date Time]
,t.Column_3
,t.Column_4
,t.Column_5
FROM (
SELECT ID
,Column_2
,MAX(EndDateTime) AS MaxDate
,Column_3
,Column_4
,Column_5
FROM @MyTable
GROUP BY ID,Column_2,Column_3,Column_4,Column_5
) t
INNER JOIN @MyTable o ON t.ID = o.ID
AND t.MaxDate = o.EndDateTime
答案 3 :(得分:-1)
当您通过select中的所有项目定义组时,必须包含在group by子句中或包含在聚合中,以便服务器知道如何处理分组值。在你的内心选择中你需要做这样的事情:
SELECT ID
,Column_2
,MAX(EndDateTime) AS MaxDate
,Column_3
,Column_4
,Column_5
FROM @MyTable
GROUP BY ID
,Column_2
,EndDateTime
,Column_3
,Column_4
,Column_5
OR
SELECT SUM(ID)
,Column_2
,MAX(EndDateTime) AS MaxDate
,SUM(Column_3)
,SUM(Column_4)
,SUM(Column_5)
FROM @MyTable
GROUP BY Column_2
不提供聚合或在组中包含其他列的行为将是未定义的。