假设(高度匿名化):
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
。
答案 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
答案 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。快乐的编码!