假设我有一个应用程序可以确定奖品中的获奖者。所有条目都输入到表中其employeeID的表中。每位员工都可以多次输入图纸。我从表中选择,按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())
但当然我不能在子查询中做订单。
答案 0 :(得分:3)
任何解决方案都必须考虑以下两点:
这是我的方法:
;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,但无论他们进入多少次,他们每次只赢一次。
答案 1 :(得分:1)
这是一个相当简单的方法来获得你想要的东西:
select top 5 EmployeeID
from
(
select EmployeeID, row_number() over (order by newid()) DrawOrder
from Events
) wins
group by EmployeeID
order by min(DrawOrder)