如何随机排序行但将组保持在一起?

boo*_*ife 5 sql-server sql-server-2014

我的桌子看起来像这样:

GroupID INT NOT NULL
SomeValue INT NOT NULL
Run Code Online (Sandbox Code Playgroud)

我想GroupID在结果集中保持相同的行。不过,这些组本身应该是随机排序的。SomeValue应该是次要排序标准。像这样:

GroupID, SomeValue
13, 1
13, 2
7, 1
7, 2
11, 1
11, 2
...
Run Code Online (Sandbox Code Playgroud)

ORDER BY GroupID, SomeValue不会随机排序组。ORDERBY NEWID()是完全随机的。ORDER BY SomeHash(GroupID), SomeValue浮现在脑海中,但我每次都需要一个新的随机顺序。

如何才能做到这一点?

ype*_*eᵀᴹ 8

您只需要GroupID值的随机顺序,因此首先在派生表中获取这些不同的值和每个值的随机数:

SELECT t.*
FROM tablename AS t
  JOIN
    ( SELECT GroupID, 
             NEWID() AS rnd   -- or another random function
      FROM tablename
      GROUP BY GroupID
    ) AS r
    ON r.GroupID = t.GroupID 
ORDER BY 
    r.rnd, 
    t.SomeValue ;
Run Code Online (Sandbox Code Playgroud)

如果您已经有一个Groups包含GroupID值的表,则可以将其替换FROM tablename GROUP BY GroupIDFROM Groups.