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 のいずれかをランダムに選択する必要があります。

INDEXNUMBER/VERSIONIDでもペアでもどちらでもいいです。

考えてみると、名簿を含むテーブルからホッケー チームの 1 つのシフトを選ぶようなものです。

利用可能な 3 つから 1 つのセンターを選択し、利用可能な 5 つから 1 つの左ウィングを選択するなど。

NEWID()and MAX/MIN(Cast NEWIDto first)で遊んでいますがvarchar、 にハングアップし続けていGROUP BYます。IGROUP BY IDの場合、 max は一度に 1 つの行で動作し、テーブル全体を生成します。

GROUP BY INDEXNUMBER, VERSION同様の結果が得られた場合(ペアは一意です)。

私がする必要があるのは、 GROUP BY INDEXNUMBER(クエリから完全に除外IDして)まだ何らかの形でVERSION.

4

2 に答える 2

4

で分割しINDEXNUMBER(具体的には明記されていませんが、それぞれから1つが必要だと思います)、次で並べ替えます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 に答える