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)
我很难过.任何想法将不胜感激.
我可能会使用一个名为的特殊排名函数来考虑它ROW_NUMBER()
.
您基本上为每一行应用一个数字,按fk
1开始分组,使用该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)
这种方法具有额外的好处,因为它在一次通过中处理分组和随机化.