当2行具有相等属性时,如何选择随机行

时间:2014-03-06 14:50:21

标签: sql sql-server

我有一个包含优先顺序的项目的表格:

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

1 个答案:

答案 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