2014-07-05 3 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

확실하지 않습니다. 어떻게 그룹 지어? 결과 outpu에 100이없는 이유는 무엇입니까? – Uriil

+0

다음 최상위 값을 선택하려면 다음 값을 얻고 싶습니다. 예를 들어,이 경우 TelNr은 100 ~ 199, 200 ~ 299, 300 ~ 399 등입니다. 때로는 번호가 누락되어 사용할 수 있습니다. 102는 102가 없으므로 101이 100 범위 내에서 처음으로 발견되는 숫자이므로 101이 없습니다. – 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 

편집 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의 등, 일부 이전 스타일의 SQL을 사용할 필요가 누락 된 값의 범위를 얻을 y는 매우 효율적이지는 않지만 행 수가 적거나 TeNr에 색인이있는 경우 ok 일 수 있습니다. 이 행의 엄청난 금액을 반환 할 수 있습니다 데이터에 따라

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 

: SQLite는 버전이 재귀 쿼리를 지원하는 경우

당신의 결과 세트의 행으로 격차의 각 값을 얻는 것은 매우 어렵다. 이 재귀에 대한 입력으로 이전 RangeStart/RangeEnd 쿼리의 결과를 사용할 수도 있습니다.

+0

절대적으로 뛰어납니다! 그것은 곧바로 작동합니다. 커다란 감사드립니다, 당신은 저에게 흰 밤을 살 렸습니다! 간격에있는 모든 값을 얻을 수있는 방법을 묻습니다. – user3808023

+0

@ user3808023 : 모든 것이 SQL에서 가능합니다. :-) 그러나 성능이 좋지 않을 수도 있습니다 .-(편집 내 대답 – dnoeth