我有以下要求:通过使用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
.......
但是我需要像集合这样的结果 CatIds in(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查询中有什么办法可以告诉我吗?
答案 0 :(得分:6)
您可以使用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, ...
,因此没有。{使用这些数字,我们可以创建一个所需的订单。
答案 1 :(得分:1)
如果我理解,
试试这个(我假设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)
答案 2 :(得分:0)
试试这个:
Select CatId,Name,Color
from Table1
where CatId in (10,11,12) order by Color, CatID
答案 3 :(得分:0)
试试这个:
SELECT ROW_NUMBER() OVER (PARTITION BY catId ORDER BY catId ) as rowNumber, * FROM Table1
WHERE catId in (10,11,12)
ORDER BY rowNumber