2014-04-09 6 views
-1

더 자세한 정보가 필요하면 최선을 다해 알려줄 것입니다.여러 데이터 세트의 데이터 비교

특정 기준에 맞는 ID 그룹을 쿼리하고 다른 ID와 비교하려고합니다. 예를 들어, 2013 년 봄 50 ID, 2013 년 여름 39 ID 및 2013 가을 ID 53 개가 있습니다. 각 목록을 그 이후에 오는 목록과 비교하여 ID를 출력 할 수 있기를 원합니다. 번호). 둘 다에있는 사람들의.

where 절에서 비교할 정확한 목록을 지정함으로써 지금 당장이 작업을 수행 할 수 있습니다. 그러나 수년에 걸쳐 하나의 목록과 이후의 목록을 비교할 수 있기를 바랍니다.

편집 :

샘플 데이터 (지금 난 그냥 한 번에 두 목록을 당길 수를 비교하기 위해) :

: 나는 목록을 비교하고의 OUPUT을 갖고 싶어

SPRING2013IDS | SUMMER2013IDS | FALL2013IDS | SPRING2014IDS 
01   | 01   | 01   | 01 
02   | 02   | 04   | 02 
03   | 04   | 05   | 03 
04   | 05   | 08   | 08 
05   | 08   | 10   | 09 
06   | 10   | 12   | 12 
07   | 11   | 13   | 13 
08   | 12   | 14   | 14 

내가 할거야 것은 단지 캘리포니아 때문에 정말도 (금액 괜찮을 것) 최종 결과에 ID 번호가 필요하지 않습니다

Spring2013toSummer2013 | Summer2013toFall2013 
01      | 01 
02      | 04 
04      | 05 
05      | 08 
08      | 10 
         | 12 

등등 ... 하나에서 다음으로 이어지는 ID의 비율을 계산하지만 프로세스가 더 원활 해지면 스스로 할 수 있다고 생각했습니다. 이것에 대해

+0

나는 당신이 무엇을하려고하는지 잘 알고 있습니다 ... 당신의 데이터 세트 나 예제를 공유하고 지금까지 시도한 것을 공유하십시오. – dima

+0

질문을 명확히하기 위해 몇 가지 샘플 입력과 출력을 보여주십시오. –

+0

희망적으로 명확히하기 위해 좀 더 많은 정보를 추가했습니다. – hanta

답변

0

방법 :

create table #MyData (
    Year smallint not null, 
    Season tinyint  not null, 
    ID  char(2)  not null 
    ); 

insert #MyData 
values 
    (2013, 1, 'aa'), 
    (2013, 1, 'bb'), 
    (2013, 1, 'cc'), 

    (2013, 2, 'aa'), 
    (2013, 2, 'bb'), 
    (2013, 2, 'dd'), 

    (2013, 3, 'aa'), 
    (2013, 3, 'bb'), 
    (2013, 3, 'dd'), 
    (2013, 3, 'ff'), 

    (2013, 4, 'aa'), 
    (2013, 4, 'bb'), 
    (2013, 4, 'dd'), 
    (2013, 4, 'ff'); 

;with KeyGroup as 
(
    select 
     (d.Year * 10) + d.Season as SelectKey, 
     Year, 
     Season, 
     d.ID 
    from #MyData as d 
) 
, RankedID as 
(
    select 
     DENSE_RANK() OVER (order by sk.SelectKey) as rnk, 
     Year, 
     Season, 
     sk.ID 
    from KeyGroup as sk 
) 
select 
    one.Year, 
    one.Season, 
    one.ID 
from RankedID as one 
inner join RankedID as following 
    on following.ID = one.ID 
    and following.rnk = one.rnk + 1; 

는 설명해 드리죠. 다음 연도에 비해 매년 & 시즌 요청했습니다. 첫 번째 작업은 '다음'을 쉽게 결정할 수있는 값을 생성하는 것입니다. +1은 다음과 같은 정수를 제공하기 때문에 정수가 유용합니다. 순위가 CTE 인 경우 원하는 그룹이 만들어집니다. KeyGroup을 사용하면 DENSE_RANK() 기능을 쉽게 사용할 수 있으며 시즌에 대한 작은 정보를 사용하면 KeyGroup을 쉽게 사용할 수 있습니다. Season-as-integer는 CASE 문을 사용하여 시즌별로 텍스트에서 쉽게 얻을 수 있습니다. 당신이 마지막 SELECT 목록에 COUNT(1)을 추가 할 수 있습니다 보너스 포인트

쿼리의 끝

group by grouping sets (
    (one.Year, one.Season, one.ID), 
    (one.Year, one.Season)); 

는 차이의 수 ID 목록의 수를 얻을 수 있습니다.

관련 문제