하나

2011-11-15 4 views
2

MS SQL :하나

표 하나가 두 --table 라우트 :를 정류장

(정지 시퀀스 키 필드 ID를 얻기 위해 INT 필드 [서열] 만)

[routes]를 [stops] 테이블에 가입시키고 처음과 마지막 경로 만 단일 행으로 되돌릴 수 있습니까?

의 나는 간단한 가입 할 수 있다고 가정 해 봅시다 :

Route 1 | Stop 1 
Route 1 | Stop 2 
Route 1 | Stop 3 
Route 2 | Stop 1 
Route 2 | Stop 2 

내가 그것을 반환 할 :

Route 1 | Stop 1 | Stop 3 
Route 2 | Stop 1 | Stop 2 
내가 그들에 가입하고 최소 (서열) 및 최대 (서열)를 얻을 수

하지만, Seq이 아닌 ID를 어떻게 얻을 수 있는지 잘 모릅니다. 거의 두 개의 조인을 원하지만 여러 필드를 원합니다. 주어진 시간에 수천 개의 경로를 반환하기 때문에 효율적이어야합니다. 따라서 테이블 정지 함수를 얻는 함수가 유용하다고 생각하지 않습니다. 그러나 연관된 최소 정지 ID를 반환하는 최소 및 최대 seq를 얻을 수 있다면 관련 데이터를 가져 오기 위해 Stops에 간단히 참여할 수 있습니다.

+0

테이블 스키마와 샘플 데이터를 게시 할 수 있습니까? 당신은 단순한 GROUP BY 만 원하는 것처럼 보이지만 확실하지 않습니다. –

답변

4
;WITH S 
    AS (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY RouteId ORDER BY seq) AS RN1, 
       ROW_NUMBER() OVER (PARTITION BY RouteId ORDER BY seq DESC) AS RN2 
     FROM Stops) 
SELECT R.Route, 
     S1.Stop, 
     S2.Stop 
FROM Routes R 
     JOIN S S1 
     ON R.Id = S1.RouteId 
     JOIN S S2 
     ON R.Id = S2.RouteId 
WHERE S1.RN1 = 1 
     AND S2.RN2 = 1 
+0

와우 ... 훌륭합니다. 아직 효율성을 테스트하지는 못했지만 매력처럼 작동했습니다. 상위 스크립트의 기능을 더 확인해야합니다. 그 중 일부는 이전에 사용했지만, 지식을 습득 할시기를 충분히 알지 못했습니다! –

+0

@ MichaelC.Gates -이 유형의 쿼리에 대한 일반 이름은 '그룹당 최대 n'또는 '그룹당 최상위 n'입니다. 효율성은 [이 기사] (http://www.sqlmag.com/article/departments/optimizing-top-n-per-group-queries)에서 다룹니다. –