我有一个包含优先顺序的项目的表格:
id priority
1 1
2 2
3 3
4 8
5 3
6 4
目前我按优先级顺序检索项目(SQL Server),尽管使用以下查询时有匹配优先级的随机项:
select item
from table
order by priority, newid()
这将返回
id priority
1 1
2 2
3 3
5 3
6 4
4 8
或
id priority
1 1
2 2
5 3
3 3
6 4
4 8
所以它大约是50/50流量
我现在要求在有两个匹配优先级时只检索一行,例如..
id priority
1 1
2 2
3 3
6 4
4 8
或
id priority
1 1
2 2
5 3
6 4
4 8
答案 0 :(得分:3)
您可以使用ROW_NUMBER
,假设SQL-Server(因为NEWID
):
WITH CTE AS
(
SELECT t.*, RN = ROW_NUMBER() OVER (PARTITION BY Priority
ORDER BY ID)
FROM dbo.table t
)
SELECT * FROM CTE WHERE RN = 1
如果这些都是列,你也可以使用这个sql:
SELECT MIN(t.ID) AS ID, t.Priority
FROM dbo.table t
GROUP BY t.priority
更新“不,我需要能够在两个(或更多)优先级匹配时获得随机行”
然后我误解了你的要求。您可以使用ORDER BY NEWID
:
WITH CTE AS
(
SELECT t.*, RN = ROW_NUMBER() OVER (PARTITION BY Priority
ORDER BY NEWID())
FROM dbo.table t
)
SELECT * FROM CTE WHERE RN = 1