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

SUMCOUNTまたはのような集計関数を使用し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 を参照してください - マーティン・スミスの提案は私の元のアイデアよりも優れています ここ)

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: 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

もちろん、これも機能します。私のソリューションよりもさらに効率的です。ありがとう、マーティン!

于 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 に答える