3

結果セットでCTEとCROSSJOINを使用しようとしています。現在の行に至るまでの4行を合計したいと思います。私が見つけたオンラインの例では、CTEは使用せず、新しく作成されたテーブルのみを使用しています(http://sqlandme.com/2011/08/17/sql-server-denali-over-rows-range/)。構文は機能するはずですが、「「ROWS」の近くの構文が正しくありません」というエラーが表示されます。

出力例は、次のステートメントを使用した場合です。SUM(y)OVER(ORDER BY x ROWS 4 PRECEDING)sum

XY SUM


     1          7     0     No prev rows, so sum is 0
     2          1     7     Sum   = 7 
     3          2     8           = 1 + 7
     4          5     10          = 2 + 1 + 7
     5          7     15          = 5 + 2 + 1 + 7
     6         34     15          = 7 + 5 + 2 + 1
     7         32     48          = 34 + 7 + 5 + 2

誰かがクエリの何が間違っているかについて何か提案がありますか?前もって感謝します。

with quarterResults as (
      <subquery in here>
)

--COLUMN1: String
--COLUMN2: Date
--COLUMN3: Date
--COLUMN4: Double
select a.TIC, a.DATADATE, a.EFFDATE, SUM(b.valuei) OVER (ORDER BY a.TIC, a.DATADATE, a.EFFDATE ROWS 4 PRECEDING) AS [SUM]
from quarterResults a
cross join quarterResults b
where a.datadate > b.datadate
group by a.tic, a.datadate, a.EFFDATE, a.valuei
order by a.TIC, a.datadate
4

2 に答える 2

2

ROWS / RANGEについて見つけたドキュメントは、SQLServer2008用ではありません。SQLServerの将来のバージョン用です。

SQL 2008でクエリを実行するための、1つのアプローチは次のようになります。

SELECT a.TIC, a.datadate, a.effdate, x.s
FROM quarterResults a
    CROSS APPLY (   SELECT ISNULL(SUM(v), 0)
                    FROM (  SELECT TOP(4) b.valuei
                            FROM quarterResults b
                            WHERE b.datadate < a.datadate
                            ORDER BY b.datadate DESC ) x(v)
                ) x(s)
ORDER BY a.TIC, a.datadate

これは潜在的にコストのかかるクエリであることに注意してください。ROWSでのOVER式の使用はおそらくより効率的ですが、SQLServer2008では使用できません。

于 2011-10-04T18:50:35.033 に答える
0

SQLServer2008にタグを付けました。

構文は、次のリリースのSQL Server 2012、別名Denaliまで準備ができていません。

于 2011-10-04T18:51:25.220 に答える