簡體   English   中英

sql server - for loop - 交叉應用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM