之間的所有值,可以說我有以下幾列 表(開始,結束,時間間隔)選擇兩個值
有沒有什麼辦法讓開始之間的所有值,與間隔結束每一個行? 注意在(Start,End,Interval)表格中會多出一行,但它們不應該重疊。
如果可能,不使用循環/遊標/臨時表/變量表。
的樣本數據
Start End Interval 1 3 1 9 12 1 16 20 2
期望的結果:
Result 1 2 3 9 10 11 12 16 18 20
之間的所有值,可以說我有以下幾列 表(開始,結束,時間間隔)選擇兩個值
有沒有什麼辦法讓開始之間的所有值,與間隔結束每一個行? 注意在(Start,End,Interval)表格中會多出一行,但它們不應該重疊。
如果可能,不使用循環/遊標/臨時表/變量表。
的樣本數據
Start End Interval 1 3 1 9 12 1 16 20 2
期望的結果:
Result 1 2 3 9 10 11 12 16 18 20
這是一個偉大的使用情況遞歸公用表表達式:
;with cte as (
select [Start] as Result, [End], [Interval]
from Table1
union all
select Result + [Interval], [End], [Interval]
from cte
where Result + [Interval] <= [End]
)
select Result
from cte
order by Result
你可以像下面這樣做
WITH tally AS (
SELECT 0 n
UNION ALL
SELECT n + 1 FROM tally WHERE n < 100 -- adjust 100 to a max possible value for (end - start)/interval
)
SELECT start + n * [interval] result
FROM Table1 t CROSS JOIN tally n
WHERE n.n <= (t.[end] - t.start)/t.[interval]
ORDER BY result
注:如果你做了很多這樣的查詢,你可能考慮替換遞歸CTE tally
帶有n
列上的主鍵的持久數字表tally
。
輸出:
| RESULT | |--------| | 1 | | 2 | | 3 | | 9 | | 10 | | 11 | | 12 | | 16 | | 18 | | 20 |
這裏是SQLFiddle演示
我知道你已經接受了答案,我想這也是正確的。
select x.number
from master..spt_values x cross join table1 t
where x.type='p' and x.number between t.[start] and t.[end]
and x.number % t.[interval] = 0
結果:
| NUMBER |
|--------|
| 1 |
| 2 |
| 3 |
| 9 |
| 10 |
| 11 |
| 12 |
| 16 |
| 18 |
| 20 |
編輯:如果你想要去的數量沒有限制嘗試這種方法,並根據需要交叉連接更多的數字表。這個例子上升到9999
;WITH Digits AS (
select Digit
from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9))
AS t(Digit))
,Numbers AS (
select u.Digit + t.Digit*10 + h.Digit*100 + th.Digit*1000 as number
from Digits u
cross join Digits t
cross join Digits h
cross join Digits th
--Add more cross joins as required
)
Select number
From Numbers x cross join table1 t
where x.number between t.[start] and t.[end]
and x.number % t.[interval] = 0;
Order by number
不要淡漠d你的措辭,你可以重述一下這個問題嗎? –
您能否提供示例輸入數據和期望的輸出? – jpw
更改了文字並添加了輸入值和輸出的示例。 – Peter