У меня есть следующее требование: с помощью предложения SQL IN с получением первой 20 записи. Мой запрос

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
 .......

Но мне нужны такие результаты, как наборы sets , в которых есть CatIds в (10,11,12)

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

Скажите, пожалуйста, есть ли способ в SQL-запросе?

3
Ray 7 Сен 2016 в 10:06

4 ответа

Лучший ответ

Вы можете использовать запрос с ROW_NUMBER:

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_NUMBER с предложением PARTITION BY, чтобы перечислить записи с фрагментами одного и того же CatId. Так, например, записям с CatId = 10 присваиваются номера 1, 2, 3, ..., затем записям с CatId = 11 аналогичным образом присваивается номер 1, 2, 3, ... и так нет. Используя эти числа, мы можем создать заказ, подобный тому, который требуется.

6
Giorgos Betsos 7 Сен 2016 в 08:26

Если я пойму,

Попробуйте это (я предполагаю, что CatId числовой):

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)
1
Joe Taras 7 Сен 2016 в 07:46

Попробуй это:

Select CatId,Name,Color 
from Table1 
where CatId in (10,11,12) order by Color, CatID
0
Dmitriy 7 Сен 2016 в 07:10

Попробуй это :

SELECT ROW_NUMBER() OVER (PARTITION BY catId ORDER BY catId ) as rowNumber, * FROM Table1
WHERE catId in (10,11,12)
ORDER BY rowNumber
0
Huojian 7 Сен 2016 в 07:22