在CTE查询中使用聚合函数

Ala*_*laa 3 t-sql sql-server-2008

以下查询正常工作没有',MAX(行)'

WITH QResult AS 
(SELECT 
    ROW_NUMBER() OVER (ORDER BY Ad_Date DESC) AS Row,
    * 
 FROM [vw_ads]
) 
SELECT *, MAX(Row) 
FROM QResult
Run Code Online (Sandbox Code Playgroud)

MAX(Row)添加,SQL Server 2008中抛出以下错误:

列'QResult.Row'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

mar*_*c_s 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
Run Code Online (Sandbox Code Playgroud)

这也意味着您需要明确拼写出您想要的列 - 无论如何都是个好主意.你不能*在一个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
Run Code Online (Sandbox Code Playgroud)

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

更新#2: Martin Smith的建议如下:

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
Run Code Online (Sandbox Code Playgroud)

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

  • @marc_s - 你可以使用`MAX(Row)OVER()` (2认同)