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 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。
提前致谢。
对于 Postgres,您可以使用:
select guid, g.i
from the_table
cross join lateral generate_series(1, entries) as g(i);
Run Code Online (Sandbox Code Playgroud)
出于兴趣,这里有一个 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()
,但这种格式可以更轻松地测试功能。
归档时间: |
|
查看次数: |
3072 次 |
最近记录: |