4

假设(高度匿名):

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()and MAX/MIN(Cast NEWIDto varcharfirst),但我一直挂断GROUP BY. 如果 I GROUP BY ID,则 max 一次在单行上运行,产生整个表。

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

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

4

2 回答 2

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 小提琴

于 2012-08-28T20:30:12.827 回答
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。快乐编码!

于 2012-08-28T21:29:58.517 回答