随机聚合?

use*_*415 5 sql t-sql sql-server-2008

我正在使用Microsoft的SQL Server 2008.我需要通过外键聚合来随机获取单个值,但我很难过.请考虑下表:

id          fk          val
----------- ----------- ----
1           100         abc
2           101         def
3           102         ghi
4           102         jkl
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

fk          val
----------- ----
100         abc
101         def
102         ghi
Run Code Online (Sandbox Code Playgroud)

其中fk 102的val随机地是"ghi"或"jkl".

我尝试使用NEWID()来获取唯一的随机值,但是,由于NEWID()值因子查询而异,因此JOIN失败.

WITH withTable AS (
    SELECT id, fk, val, CAST(NEWID() AS CHAR(36)) random
    FROM exampleTable
)
SELECT t1.fk, t1.val
FROM withTable t1
JOIN (
    SELECT fk, MAX(random) random
    FROM withTable
    GROUP BY fk
) t2 ON t2.random = t1.random
;
Run Code Online (Sandbox Code Playgroud)

我很难过.任何想法将不胜感激.

Cᴏʀ*_*ᴏʀʏ 6

我可能会使用一个名为的特殊排名函数来考虑它ROW_NUMBER().

您基本上为每一行应用一个数字,按fk1开始分组,使用该NEWID()函数作为排序值随机排序.从中可以选择行号为1的所有行.此技术的作用是随机化为哪一行分配值1.

WITH withTable(id, fk, val, rownum) AS 
(
    SELECT
        id, fk, val, ROW_NUMBER() OVER (PARTITION BY fk ORDER BY NEWID())
    FROM
        exampleTable
)
SELECT
    *
FROM
    withTable
WHERE
    rownum = 1
Run Code Online (Sandbox Code Playgroud)

这种方法具有额外的好处,因为它在一次通过中处理分组和随机化.