2012-10-06 3 views
2

이 SQL 문제에 봉착했습니다.SQL : 다양한 시작점에서 순차적 인 숫자 목록 생성

시작점 (prevdoc)의 목록 인 열과 시작점 (exdiff) 이후에 필요한 일련 번호의 수를 나열하는 anther 열이 있습니다.

예를 들어, 여기에 처음 몇 행은 다음과 같습니다 심지어 시작하는 곳으로 잃었어요

2 
3 
4 
22 
23 
127 
128 

:

prevdoc | exdiff 
----------------  
1  | 3 
21  | 2 
126  | 2 

그래서 내가 좋아하는 뭔가를 찾기 위해 출력을해야합니다. 누구든지이 솔루션에 대한 SQL 코드를 알려 줄 수 있습니까?

감사합니다. 숫자가 너무 큰 수없는 경우

+1

1이 시작 지점 인 경우 왜 2시에 출력을 시작합니까? – EvilTeach

+0

좋은 질문입니다. 나는 사람들이 생각해 낼 수있는 것에 매우 관심이 있습니다. SQL은 집합 (즉, 정수 집합)에서 작동하므로 Gordon이 제안한 것보다 간단한 해결 방법이 있다고 가정합니다. –

+0

@EvilTeach : 나는이 질문이 당신의 질문에 대답한다고 생각한다 : * 시작점 ('exdiff') * (강조는 나의 것) 이후에 ** 필요한 순차 번호를 나열하는 열. –

답변

0

, 당신은 대부분의 데이터베이스에 다음과 같은 트릭을 사용할 수 있습니다 : 서브 쿼리의 INFORMATION_SCHEMA 열

select t.exdiff + seqnum 
from t join 
    (select row_number() over (order by column_name) as seqnum 
     from INFORMATION_SCHEMA.columns 
    ) nums 
    on t.exdiff <= seqnum 

사용은 임의적이다. 유일한 목적은 최대 exdiff 수만큼 일련의 숫자를 생성하는 것입니다.

이 접근 방식은 순위 지정 기능을 지원하는 모든 데이터베이스에서 작동합니다. 대부분의 데이터베이스에는 시퀀스를 생성하는 데이터베이스 별 방법이 있습니다 (예 : SQL Server에서 재귀 CTE 및 Oracle에서 CONNECT BY). 당신의 exdiff는 소수가 될 것입니다 경우

+0

subselect가 테이블 c를 감지 할 수 없으므로 subselect에서 prevdoc을 참조 할 수 없습니다. 교차 적용이 더러워 보인다. 그래서 newest() 또는 기존 열 중 하나를 참조하는 것이 가장 좋습니다. –

+0

* "대부분의 데이터베이스에는 시퀀스를 생성하는 데이터베이스 관련 방법이 있습니다."* 또한 PostgreSQL에서 암호로 생성 된'generate_series()'함수. –

+0

죄송합니다. 자의적인 내용이지만 information_schema.columns에 대해 혼란 스럽습니다. 그것은 무엇이며 어떻게 사용합니까? – apd2zn

1
;with a as 
(
select prevdoc + 1 col, exdiff 
from <table> where exdiff > 0 
union all 
select col + 1, exdiff - 1 
from a 
where exdiff > 1 
) 
select col 
1

는 다음과 같이, 당신은 SELECT..UNION ALL를 사용하여 숫자의 가상 테이블을 구성 할 수 있으며 조인 :

select prevdoc+number 
from doc 
join (select 1 number union all 
     select 2 union all 
     select 3 union all 
     select 4 union all 
     select 5) x on x.number <= doc.exdiff 
order by 1; 

내가 5 제공 한을하지만, 필요에 따라 확장 할 수 있습니다. 당신은 당신의 DBMS를 지정하지 않은,하지만 하나 하나에 SQL Server의 예를 들어, 당신이 사용할 수있는, 일련 번호의 원천이 될 것입니다 :

select prevdoc+number 
from doc 
join master..spt_values v on 
    v.number <= doc.exdiff and 
    v.number >= 1 and 
    v.type = 'p' 
order by 1; 

master..spt_values ​​테이블 0-2047을 사이에 숫자가 포함 (type = 'p'로 필터링 된 경우).