3

以下查询在没有',MAX(Row)' 的情况下工作正常

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子句中。

4

2 回答 2

7

当使用SUM,COUNT或之类的聚合函数MAX并且您还想从数据中选择其他列时,您需要按查询中使用的其他列对数据进行分组。

因此,您需要编写如下内容:

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 - Martin Smith 的建议甚至比我最初的想法更好

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

Row这将为您的结果集的每一行提供 CTE的最大值,即相同的值。

更新#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

当然,这也有效 - 甚至比我的解决方案更有效。谢谢,马丁!

于 2012-05-24T19:38:20.430 回答
1

您需要决定为什么要获得 MAX(Row)。它是 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 返回您的最大行,这就是我假设您正在寻找的内容。

于 2012-05-24T19:40:38.030 回答