我需要創建磁區。假設我有這個表:
CREATE TABLE MyTable (Pos INT UNIQUE, X INT)
INSERT INTO MyTable VALUES (3, 2)
INSERT INTO MyTable VALUES (5, 0)
INSERT INTO MyTable VALUES (6, 0)
INSERT INTO MyTable VALUES (9, 0)
INSERT INTO MyTable VALUES (43, 9)
INSERT INTO MyTable VALUES (53, 8)
INSERT INTO MyTable VALUES (56, 0)
INSERT INTO MyTable VALUES (81, 0)
INSERT INTO MyTable VALUES (163, 1)
INSERT INTO MyTable VALUES (9716, 0)
查詢結果應該是這個表加了Y列,Y應該是
IF X=0 : 前一個值 X<>0 (OR NULL, 如果不存在),按 Pos 排序
如果 X<>0 : X
所需答案表如下所示
SELECT *
FROM MyQuery as a function of MyTable
ORDER BY Pos
Pos X Y
3 2 2
5 0 2
6 0 2
9 0 2
43 9 9
53 8 8
56 0 8
81 0 8
163 1 1
9716 0 1
uj5u.com熱心網友回復:
這是一種間隙和孤島問題。
有很多解決方案,這里是一個:
- 使用運行條件計數對我們要組合在一起的行進行編號
- 使用磁區條件
MIN來獲取我們真正想要的唯一值,每組
WITH StartPoints AS (
SELECT *,
GroupId = COUNT(NULLIF(X, 0)) OVER (ORDER BY Pos)
FROM MyTable
)
SELECT
Pos,
X,
Y = MIN(NULLIF(X, 0)) OVER (PARTITION BY GroupId)
FROM StartPoints
ORDER BY Pos;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336036.html
標籤:sql sql-server 查询语句
