根据列值返回行数

Vin*_* A. 7 stored-procedures functions

我们正在为客户管理抽奖活动,其中我们有一个与参赛者和参赛者获得的参赛作品数量相关联的 GUID。我希望能够根据与参赛人数相对应的获胜机会来抽取获胜者。

GUID | Entries
--------------
1    | 1
2    | 5
3    | 2
4    | 7
Run Code Online (Sandbox Code Playgroud)

所以结果将是:

GUID
----
1
2
2
2
2
2
3
3
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)

基本上我计划将结果放在电子表格中,然后使用随机数生成器在 1 和 n 之间选择一个行号,其中 n 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。

提前致谢。

a_h*_*ame 9

对于 Postgres,您可以使用:

select guid, g.i
from the_table
  cross join lateral generate_series(1, entries) as g(i);
Run Code Online (Sandbox Code Playgroud)


For*_*est 5

出于兴趣,这里有一个 SQL Server 2016 的解决方案,它使用内置的 [伪] 随机数生成器为您挑选一个获胜者。

一、数据:

CREATE TABLE #t
(ID int,
Entries int)

INSERT #t
VALUES
(1,1),
(2,5),
(3,2),
(4,7)
Run Code Online (Sandbox Code Playgroud)

然后代码:

DECLARE @r float = RAND()

SELECT TOP 1 ID, @r
FROM (
    SELECT ID,
    Entries,
    SUM(Entries) OVER(ORDER BY ID) / CONVERT(float,SUM(Entries) OVER()) AS RunningFraction
    FROM #t
) RF
WHERE RunningFraction > @r
ORDER BY ID
Run Code Online (Sandbox Code Playgroud)

您可以跳过变量声明而只使用WHERE RunningFraction > RAND(),但这种格式可以更轻松地测试功能。