2016-09-07 4 views
3

다음 조건이 있어야합니다. SQL IN 절을 사용하여 상위 20 개 레코드를 가져와야합니다. 내 쿼리는SQL 쿼리에서 SQL 결과를 다른 집합으로 가져 오는 방법

Select CatId,Name,Color 
from Table1 
where CatId in (10,11,12) 

이며, 결과는

CatId | Name | Color 
------- -------- ------ 
10  Name1 Blue 
10  Name2 red 
10  Name3 Blue 
11  Name4 Blue 
10  Name5 red 
12  Name6 Blue 
11  Name7 Blue 
12  Name8 Blue 
....... 

처럼하지만 (10,11,12)

CatId | Name | Color 
------- -------- ------ 
10  Name1 Blue 
11  Name4 Blue 
12  Name6 Blue 
10  Name2 Red 
11  Name7 red 
12  Name8 Blue 
...... 

CatIds있다 설정 세트 같은 결과를 필요 SQL 쿼리에 어떤 식 으로든 말해 주시겠습니까?

답변

6

Select CatId, Name, Color 
from (
    Select CatId, Name, Color, 
      row_number() over (partition by CatId order by Name) AS rn 
    from mytable 
    where CatId in (10,11,12)) as t 
order by rn, Name 

위의 쿼리는 ROW_NUMBERPARTITION BY 절과 함께 사용하므로 동일한 CatId의 조각이있는 레코드를 열거합니다. 예를 들어 CatId = 10의 레코드에는 1, 2, 3, ...이 할당되고 CatId = 11의 레코드에는 마찬가지로 1, 2, 3, ...이라는 레코드가 할당됩니다. 이 숫자를 사용하여 필요한 것과 같은 순서를 만들 수 있습니다.

+0

당신이 위의 쿼리를 설명해 주시겠습니까? –

+0

안녕하세요, 고맙습니다 ...... – Ray

+0

@GiorgosBetsos ROW_NUMBER 및 PARTITION BY의 작업이 있지만 어떻게 패턴이 10,11,12,10,11,12로 표시 될까요? –

0

이 시도 :

이해하면
Select CatId,Name,Color 
from Table1 
where CatId in (10,11,12) order by Color, CatID 
1

,

노력이 (내가 CATID 숫자라고 가정) :

: 당신은 ROW_NUMBER와 쿼리를 사용할 수 있습니다
Select CatId, Name, Color 
from Table1 T 
where CatId in (10,11,12) 
order by CatId + CatId * ISNULL(
    (SELECT COUNT(*) FROM Table1 T1 
    WHERE T.CatId = T1.CatId 
    AND T.Name > T1.Name), 0) 
0

이 시도 :

SELECT ROW_NUMBER() OVER (PARTITION BY catId ORDER BY catId) as rowNumber, * FROM Table1 
WHERE catId in (10,11,12) 
ORDER BY rowNumber 
관련 문제