2012-05-24 76 views
3

下面的查询使用聚合函数时没有 'MAX(行)'在CTE查询

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

你究竟想要展示什么。也许提供一些示例数据? –

回答

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的最大值,对于结果集的每一行,值相同。

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

,当然还有,这个工作,太 - 甚至比我的解决方案更有效。谢谢,马丁!

+0

感谢您的回答,我只想在同一个查询中获取返回的行的数量或“行”的最大值,以避免单独调用数据库或提高性能相当多,本例中的代码将为每个数据行返回'Row'的相关值,而不是聚合(最大值)! – Alaa

+0

@Ala:根据您的评论更新我的回复 –

+2

@marc_s - 您可以使用MAX(Row)OVER()' –

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最大行这就是我假设你正在寻找。

+0

感谢您的回答,我只想在同一个查询中获取返回的行的数量或“行”的最大值,以避免单独调用数据库或提高性能相当多,在这种情况下,您的代码将为每个数据行返回相关的'Row'值,而不是聚合值(最大值)! – Alaa