2013-10-17 106 views
0

之間的所有值,可以說我有以下幾列 表(開始,結束,時間間隔)選擇兩個值

有沒有什麼辦法讓開始之間的所有值,與間隔結束每一個行? 注意在(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 
+0

不要淡漠d你的措辭,你可以重述一下這個問題嗎? –

+0

您能否提供示例輸入數據和期望的輸出? – jpw

+0

更改了文字並添加了輸入值和輸出的示例。 – Peter

回答

4

這是一個偉大的使用情況遞歸公用表表達式:

;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 

sql fiddle demo

2

你可以像下面這樣做

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演示

+0

如果你知道HINDI然後「Man Gaye Ustad」 – Dhaval

+0

喜歡這個例子,你在哪裏第一,但你硬編碼的最大限度@RomanPekar並不是這就是爲什麼我選擇他的解決方案 – Peter

1

我知道你已經接受了答案,我想這也是正確的。

Fiddle demo 1;

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

Fiddle demo 2

;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 
+0

這沒有奏效,值之間的值缺失。 ..(10,11,18) – Peter

+0

間隔設置爲2這就是爲什麼我不想要17如果你看它也跳過19 .. – Peter

+0

啊,好吧,知道了,並更新了。 – Kaf