假设我有一张赌注表,金额(小数)和已创建(时间戳),我如何选择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/

10-16 18:53