假设我有一个应用程序可以确定抽奖的获奖者。所有条目都输入到一个表中,指示其员工 ID。每个员工可以多次进入绘图。我从表中选择,按 newid 排序以获得随机排序。我假设员工的条目(数据库记录)越多,每次运行查询时,他最终进入查询前 5 名的机会就越大。到目前为止,一切都很好。但是,由于每个员工都有多条记录,因此他很有可能多次出现在前 5 名中。我需要能够从随机排序的结果中返回 5 条唯一记录。
如何获得 5 个唯一行,同时仍确保具有多个绘图条目的行在选择中获得更大的权重?
我的基本查询:
SELECT TOP 5 employeeID
FROM events
TABLESAMPLE(1000 ROWS)
ORDER BY CHECKSUM(NEWID());
我正在尝试做的事情:
SELECT TOP 5 *
FROM events
WHERE employeeID IN (SELECT employeeID
FROM events
TABLESAMPLE(1000 ROWS)
ORDER BY CHECKSUM(NEWID())
)
ORDER BY CHECKSUM(NEWID())
但是我当然不能在子查询中执行 order by 。
最佳答案
任何解决方案都必须考虑两件事:
- 如果一名员工输入多张彩票,他获胜的机会相对于其他人会增加。
- 每个人只能赢一次
这是我的方法:
;WITH
tmp1 AS
(
SELECT EmployeeID,
ROW_NUMBER() OVER (ORDER BY NEWID()) AS SortOrder
FROM Events
),
tmp2 AS
(
SELECT EmployeeID,
MIN(SortOrder) AS WinOrder
FROM tmp1
GROUP BY EmployeeID
)
SELECT TOP 5 *
FROM tmp2
ORDER BY WinOrder
SQL Fiddle为员工提供 1 和 5 更高的获胜机会,但无论他们参加多少次,他们每人只能获胜一次。
关于sql - 独特的前 5 名随机查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25513047/