2014-07-05 37 views
0

如何僅檢索只有連續值的組的最大值?在一組連續值中選擇最大值

我有一個電話數據庫,只有唯一的值,我只想得到每個電話號碼組的最高號碼TelNr,我掙扎着。

id  |  TeNr  |  Position 
1  |  100  |  SLMO2.1.3 
2  |  101  |  SLMO2.3.4 
3  |  103  |  SLMO2.4.1 
4  |  104  |  SLMO2.3.2 
5  |  200  |  SLMO2.5.1 
6  |  201  |  SLMO2.5.2 
7  |  204  |  SLMO2.5.5 
8  |  300  |  SLMO2.3.5 
9  |  301  |  SLMO2.6.2 
10  |  401  |  SLMO2.4.8 

的結果應該是:

TelNr 
101 
104 
201 
204 
301 
401 

我已經試過幾乎所有的提示,我能找到到目前爲止,是否我得到的所有TelNr或根本沒有數這是在我的情況也沒用。

任何輝煌的想法,用SQLITE運行這個?

+0

目前尚不清楚。你如何分組?爲什麼沒有100結果輸出? – Uriil

+0

因爲我想獲得最後一個最高值以便能夠選擇下一個值。例如,在這種情況下,TelNr是100到199,200到299,300到399等等。有時數字不見了,所以我可以使用它們。 100不存在,因爲101是在100範圍內發現的第一個最高數字,因爲102失蹤:) – user3808023

回答

1

因此,您正在尋找差距,並希望獲得這些差距的第一個值。

這可能是讓他們最好的方式,嘗試與當前TeNr加1,檢查是否有行,如果有你沒有發現它:

select t1.TeNr, t1.TeNr + 1 as unused_TeNr 
from tab as t1 
left join Tab as t2 
on t2.TeNr = t1.TeNr + 1 
where t2.TeNr is null 

編輯:

要得到你需要使用一些老式的SQL缺失值的範圍爲SQLite的似乎不支持ROW_NUMBER等

select 
    TeNr + 1 as RangeStart, 
    nextTeNr - 1 as RangeEnd, 
    nextTeNr - TeNr - 1 as cnt 
from 
(
    select TeNr, 
    (select min(TeNr) from tab as t2 
     where t2.TeNr > t1.TeNr) as nextTeNr 
    from tab as t1 
) as dt 
where nextTeNr > TeNr + 1 

這是probabl y效率不高,但如果行數很少和/或TeNr上有索引,則可能會有問題。

獲取的差距在結果集的行中的每個值是很辛苦的,如果你的SQLite版本支持遞歸查詢:

with recursive cte (TeNr, missing, maxTeNr) as 
(
    select 
     min(TeNr) as TeNr, -- start of range of existing numbers 
     0 as missing,  -- 0 = TeNr exists, 1 = TeNr is missing 
     max(TeNr) as maxTeNr -- end of range of existing numbers 
    from tab 

    union all 

    select 
     cte.TeNr + 1,  -- next TeNr, if it doesn't exists tab.TeNr will be NULL 
     case when tab.TeNr is not null then 0 else 1 end, 
     maxTeNr 
    from cte left join tab 
    on tab.TeNr = cte.TeNr + 1 
    where cte.TeNr + 1 < maxTeNr 
) 
select TeNr 
from cte 
where missing = 1 

根據您的數據,這可能返回一個巨大的行量。 您也可以使用前一個RangeStart/RangeEnd查詢的結果作爲此遞歸的輸入。

+0

絕對的輝煌!它可以直接使用。 非常感謝你dnoeth,你爲我節省了一些白夜! 我可以問一下我們如何能夠獲得所有的差距? – user3808023

+0

@ user3808023:一切都可能在SQL中:-)但它可能會導致不良的表現:-(編輯我的答案 – dnoeth