gpt4 book ai didi

php - MySQL 中的峰值投注

转载 作者:行者123 更新时间:2023-11-30 23:14:34 25 4
gpt4 key购买 nike

假设我有一个赌注表,金额(小数)和创建(时间戳),我如何选择 24 小时内的峰值赌注(例如,最大赌注的 24 小时并选择该金额?)

我有使用 MySQL 的经验,但不知道如何处理这种情况。

最佳答案

我将使用 PostgreSQL 来说明这一点,只是因为它更容易快速生成数据。

创建一个桶表。该表将用于对数据进行分组。对于此示例,我使用了一天的粒度。也就是说,我把“24小时内的最高投注额”指的是从午夜开始的24小时内的最大投注额。 (不同的粒度需要不同的桶,但是原理是一样的。)

create table buckets (
bucket_start timestamp primary key,
bucket_end timestamp unique
);

with starts as (
select generate_series(timestamp '2013-01-01', timestamp '2013-01-31', '1 day') bucket_start
)
insert into buckets
select bucket_start, bucket_start + interval '1 day' as bucket_end
from starts;

该 SQL 将为您提供一个包含两列的表,开始和结束存储桶相隔一天。现在进行一些赌注。 (同样,PostgreSQL。您将不得不放弃在 MySQL 中强制执行 CHECK() 约束,但无论如何您都应该包括它以记录您的意图。)

create table bets (
bet_created timestamp not null,
bet_amount numeric(14, 2) not null
check (bet_amount > 0),
primary key (bet_created)
);

insert into bets values
('2013-01-01 00:00:01', 13.50),
('2013-01-01 00:00:02', 13.50),
('2013-01-02 00:00:01', 12.50),
('2013-01-02 00:00:02', 11.50);

现在桶表涵盖的每个时期的金额只是一个外部连接和一个分组。

select buckets.bucket_start, sum(coalesce(bet_amount, 0))
from bets
right join buckets
on bets.bet_created between buckets.bucket_start and buckets.bucket_end
group by bucket_start
order by bucket_start;

2013-01-01 00:00:00 27.00
2013-01-02 00:00:00 24.00
2013-01-03 00:00:00 0
...

要从该集合中剔除最大值,您可以降序排序,并取第一行。还有其他方法。

select buckets.bucket_start, sum(coalesce(bet_amount, 0))
from bets
right join buckets
on bets.bet_created between buckets.bucket_start and buckets.bucket_end
group by bucket_start
order by sum desc
limit 1;

2013-01-01 00:00:00 27.00

关于php - MySQL 中的峰值投注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18537793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com