goal个 抽第一名到第五名的入场券.一个用户不可能赢得多个位置.如果用户没有下单,那么他们的所有门票都必须在抽奖时考虑在内.

progress个 我能抽出一个获胜者,但不能全部抽到五个.

IDea个 我可以再重复查询4次,每次删除前面的USER_ID.但肯定有更好的办法.

question个 我怎么才能把5张票都抽出来呢?

tickets table

  • ID
  • user_ID
  • 金额
  • 创建于

this is my query

WITH gen_tickets AS (
    -- Use `generate_series()` to create a row for each ticket
    SELECT user_ID, 金额, 创建于
    FROM tickets
    CROSS JOIN LATERAL generate_series(1, CAST(金额 AS INTEGER))
),
shuffle AS (
    SELECT user_ID, 金额, row_number() OVER (ORDER BY random()) AS rn
    FROM gen_tickets
)
SELECT * FROM shuffle
ORDER BY RANDOM()
LIMIT 1;

推荐答案

您可以使用generate_series创建每张票的一个骰子卷. 然后 Select 掷点数最高的五个用户:

SELECT  *
FROM    (
        SELECT  user_id
        ,       max(random()) as roll
        FROM    tickets
        CROSS JOIN
                generate_series(1, amount) gs(num)
        GROUP BY
                user_id
        ) s
ORDER BY
        roll DESC
LIMIT   5

Example at DB Fiddle

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

我如何计算字母a出现的字符串的次数?

通过 Select 值的顺序进行排序ClickHouse

retrofit AWS Athena中的JSON

更新其组的日期字段值小于最大日期减go 天数的记录

使用Kotlin Exposed SQL DSL Select 多个值并排序

对多个条件的SQL进行排名

如何计算给定日期前三个月的值以及月初数据?

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

表函数的作用域和功能

GRAFANA 数据库查询错误:pq:列名称不存在

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

如何通过CROSS APPLY获取多级嵌套JSON属性的值?

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

我需要遍历权重值表并确定每个权重是否有效

从每行中排除最大元素

如何计算每行出现的次数并显示在另一个表中?

使用标准SQL 触发更新当前日期

将单行中的多个行值转换为列