以下查询在没有',MAX(行)'
的情况下正常工作WITH QResult AS
(SELECT
ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,
*
FROM [vw_ads]
)
SELECT *, MAX(Row)
FROM QResult
添加MAX(Row)
时,SQL Server 2008会抛出以下错误:
专栏' QResult.Row'在选择列表中无效,因为它不是 包含在聚合函数或
GROUP BY
子句中。
答案 0 :(得分:6)
使用SUM
,COUNT
或MAX
等聚合函数时,如果还要从数据中选择其他列,则需要按其他列对数据进行分组(s)在您的查询中使用。
所以你需要写一些像:
WITH QResult AS
(SELECT
ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,
*
FROM [vw_ads]
)
SELECT Co1l, Col2, MAX(Row)
FROM QResult
GROUP BY Col1, Col2
这也意味着你需要明确地拼出你想要的列 - 无论如何都是个好主意。您无法在*
子句中使用GROUP BY
。
更新:根据您的评论,我猜您真正想要的是这样的:
(参见更新#2 - 马丁史密斯的建议甚至比我原来的想法更好)
WITH QResult AS
(SELECT
ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,
*
FROM [vw_ads]
)
SELECT
Co1l, Col2,
MaxRow = (SELECT MAX(Row) FROM QResult)
FROM QResult
对于结果集的每一行,这将为您提供CTE中Row
的最大值,相同的值。
更新#2:马丁史密斯的建议如下:
WITH QResult AS
(SELECT
ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,
*
FROM [vw_ads]
)
SELECT
Co1l, Col2,
MAX(Row) OVER()
FROM QResult
当然,这也有效 - 甚至比我的解决方案更有效率。谢谢,马丁!
答案 1 :(得分:1)
您需要确定获得MAX(行)的原因。它是Ad_Date的最大行吗?总体上是最大行吗?
如果您将其更改为:
WITH QResult AS (SELECT ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,* FROM [vw_ads])
SELECT Ad_Date, MAX(Row) from QResult
GROUP BY Ad_Date
...这将返回Ad_Date的最大行,这是我假设你正在寻找的。 p>