独特的前5个随机查询

时间:2014-08-26 18:45:35

标签: sql sql-server tsql sorting

假设我有一个应用程序可以确定奖品中的获奖者。所有条目都输入到表中其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())

但当然我不能在子查询中做订单。

2 个答案:

答案 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)