如何从数据库中选择随机行 - 扭曲?

时间:2012-08-28 20:17:45

标签: sql-server random

假设(高度匿名化):

Create Table myTable
(
ID INT PK,
INDEXNUMBER INT,
VERSION INT,
Data VARCHAR(MAX)
)

此表用于存储互斥数据。 例如:

100 1 1 BOB
217 1 2 JOHN
319 1 3 GEORGE
420 7 1 MARY
415 7 2 SUSAN

在这种情况下,我需要随机选择一个BOB,JOHN或GEORGE以及MARY或SUSAN之一。

我对ID或INDEXNUMBER/VERSION对感到满意。

如果有必要考虑一下,就像从包含名单的表格中选择曲棍球队的一个班次:

从3个中选择1个中心, 从5个可用的选择1左翼等

我一直在玩NEWID()MAX/MIN(首先将NEWID投放到varchar),但我一直挂在GROUP BY上。如果我GROUP BY ID,那么max一次只能在一行上运行,从而产生整个表格。

如果我GROUP BY INDEXNUMBER, VERSION我得到了类似的结果(该对是唯一的)。

我需要做的是GROUP BY INDEXNUMBER(完全从查询中排除ID),但却以某种方式检索VERSION

2 个答案:

答案 0 :(得分:4)

INDEXNUMBER的分区(我假设您需要一个,但没有明确说明)并按NEWID()排序

SELECT ID
FROM (
    SELECT 
        Row_Number() OVER (PARTITION BY INDEXNUMBER ORDER BY NEWID()) Sort,
        ID, 
        Data
    FROM myTable
) s
WHERE Sort = 1

Sql Fiddle

答案 1 :(得分:0)

解决方案很简单,使用临时表连接数据。 请参阅我的示例代码:

--drop temp table if exists...
if OBJECT_ID('tempdb..#tempData') is not null
begin
 drop table #tempData
end
go

--select distinct INDEXNUMBER and fill temp table...
select distinct INDEXNUMBER into #tempData
from myTable
go

--join temp table with actual data to get randon rows...
select T.INDEXNUMBER,
(
  select top 1 VERSION 
  from myTable where 
  INDEXNUMBER=T.INDEXNUMBER 
  order by NEWID()
) 'Version'
from #tempData T

此语法适用于SQL Server。快乐的编码!