[英]sql server - for loop - cross apply
對於下表,我需要在SQL Server 2008中執行循環操作:
表中的列Day可以具有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
輸出:
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
無法弄清楚如何為每k獲得y = y + 1。
我不被允許使用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子句中使用order by時,它給出了一個錯誤:
The Parallel Data Warehouse (PDW) features are not enabled.
你很近。 我正在運行SQL Server 2016.結果應該是相同的。 注意預期結果中的Key和Day列與TableA中的原始數據不匹配。
WITH TableY AS
(
SELECT A.[Key], A.[Day], A.X AS xj, B.[Day] AS k, B.X AS xk,
(CASE WHEN B.X >= A.X THEN 1 ELSE 0 END) AS y
FROM @TableA AS A
INNER JOIN @TableA AS B ON A.[Key] = B.[Key]
)
SELECT *,
SUM(y) OVER(
PARTITION BY [Key], [Day]
ORDER BY k
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS 'RunningTotalY'
FROM TableY
ORDER BY [Key], [Day], xj, k;
不確定PDW錯誤是如何產生的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.