sql - 独特的前 5 名随机查询

标签 sql sql-server t-sql sorting

假设我有一个应用程序可以确定抽奖的获奖者。所有条目都输入到一个表中,指示其员工 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/

相关文章:

sql - 这个 WHERE 子句和这个 Join 有什么区别?

java - SQLException : The connection string contains a badly formed name or value

t-sql - 从存储过程中获取 Top N

sql-server - 缺口和岛屿?或不?

sql - 在 SQL 中计算每个类别产品的数量

mysql select query - 将一个字段与另一个字段匹配

sql - 是否可以防止 ORDS 转义我的 GeoJSON?

sql - 游标内的动态 SQL

python - "Insert Into"语句由于"Parameter 7 ("而导致错误"): The supplied value is not a valid instance of data type float."

sql - 无法连接到SQL