我有一張這樣的桌子:

這個想法是只有當我在列有“包含”時才計算include_appt,當它找到 NULL 時,它應該跳過設定為“NULL”或“0”,然后在下一次找到“包含”時重新計算它停止的位置。
上面的截圖我幾乎可以做到,但不幸的是計數沒有在下一個值上重置。
PS:我不能使用 over partition 因為我必須通過 id ASC 保持順序
uj5u.com熱心網友回復:
如果您試圖阻止為 NULL/0 值添加行號,為什么不嘗試這樣的查詢呢?
SELECT
row_num AS id,
include_appt,
ROW_NUMBER() OVER
(
ORDER BY (SELECT 0)
) AS row_num2
FROM C
WHERE ISNULL(C.include_appt, 0) <> 0
ORDER BY row_num
我建議重新考慮您希望在最終結果中顯示的列名/別名以避免混淆,但上述內容應該有效地滿足您的需求。
uj5u.com熱心網友回復:
你需要一個PARTITION BY條款
SELECT
row_num AS id,
include_appt,
CASE WHEN include_appt IS NULL
THEN 0
ELSE
ROW_NUMBER() OVER (PARTITION BY include_appt ORDER BY (SELECT 0))
END AS row_num2
FROM C
ORDER BY row_num
uj5u.com熱心網友回復:
SELECT id, include_appt,
CASE WHEN include_appt IS NULL THEN 0
ELSE ROW_NUMBER() OVER (PARTITION BY include_appt ORDER BY id ASC)
END AS row_num
FROM #1 ORDER BY id asc
uj5u.com熱心網友回復:
這可以通過partition by include_appt下面的另一個答案輕松完成,但是在使用查詢計劃之后,我決定仍然值得考慮這種可能會提高性能的稍微不同的方法。我相信通過能夠使用聚集索引而不涉及對flag列進行排序可以獲得好處:
select id, flag,
case when flag is not null
then row_number() over (order by id)
- count(case when flag is null then 1 end) over (order by id)
else 0 end /* count up the skips */ as new_rn
from T
order by id
示例(包括“重置”行為):https ://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=c9f4c187c494d2a402e43a3b24924581
性能對比: https ://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=719f7bd26135ab498d11c786f1b1b28b
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466134.html
