在CTE查询中使用聚合函数

时间:2012-05-24 19:31:38

标签: sql-server-2008 tsql

以下查询在没有',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子句中。

2 个答案:

答案 0 :(得分:6)

使用SUMCOUNTMAX等聚合函数时,如果还要从数据中选择其他列,则需要按其他列对数据进行分组(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的最大行,这是我假设你正在寻找的。