を適用渡り、私はSQL Server 2008でループ動作を実行する必要があります。SQL Serverの - ループのために - 下の表では
列の表の日は、0から9
に値を持つことができますFor j = 0 to 9: (Iterate through the column **Day**)
y=0;
For k = 0 to 9: (Iterate through the column **Day** again)
if x[k] >= x[j]: y= y+1;
表A:
Key|Day| x | y |
---|---|----|---|
123| 0 |7000| |
123| 2 |6000| |
123| 9 |6500| |
私はクロスが適用されます使用していると、次しまっ:
select * from TableA A
cross apply (
select Day as k, case when B.x >= A.x then 1 else 0 end as y
from TableA B
where A.Key = B.Key
) C
出力:すべてのkについてY = Y + 1を取得する方法を見つけ出すことが
Key|Day|x[j]|k |x[k]|y |y - What I need
---|---|----|--|----|--|----------------
123|0 |7000|0 |7000|1 |1
123|0 |7000|2 |6000|0 |1
123|0 |7000|9 |6500|0 |1
123|2 |6000|0 |7000|1 |1
123|2 |6000|2 |6000|1 |2
123|2 |6000|9 |6500|1 |3
123|9 |6500|0 |7000|1 |1
123|9 |6500|2 |6000|0 |1
123|9 |6500|9 |6500|1 |2
ことができません。
私はjoin
を使用できません。しかし、参加のパフォーマンスがクロス・アプリケーションよりも良い場合は、ソリューションを共有してください。
助けてください。おかげ
編集:
select * from TableA A
cross apply (
select Day as k
,sum(case when B.x >= A.x then 1 else 0 end) over (partition by A.Key,A.Day) as y
from TableA B
where A.Key = B.Key
) C
をしかし、それは私に正しい出力を与えるものではありません: 私は条件を実行している合計を計算するには、次の試してみました。私が取得:
またKey|Day|x[j]|k |x[k]|y |y - What I need
---|---|----|--|----|--|----------------
123|0 |7000|0 |7000|1 |1
123|0 |7000|2 |6000|1 |1
123|0 |7000|9 |6500|1 |1
123|2 |6000|0 |7000|3 |1
123|2 |6000|2 |6000|3 |2
123|2 |6000|9 |6500|3 |3
123|9 |6500|0 |7000|2 |1
123|9 |6500|2 |6000|2 |1
123|9 |6500|9 |6500|2 |2
、私はそれは私にエラーを与えるOVER句内で順序を使用する場合:
The Parallel Data Warehouse (PDW) features are not enabled.
なぜあなたは「参加」を「許可」していませんか? 「クロス適用」は、「結合」 - 横方向のクロス結合でもあります。 –
悲しいことに、私はそれに明確な答えはありません。 DBは1分間に大量のトランザクションを処理します。しかし、上記の操作を実行する必要があるテーブルは1日に1回しか更新されないため、「結合」を使用するソリューションの方がうまくいく場合は、私の「上位のアップ」を説得しようとします。 – BugBug
あなたはクロスジョインについて権利を行使しましたが、実行中の合計(最後の列)に悩まされています。それを検索してみてください。 – qxg