MySQL的最高赌注

时间:2013-08-30 16:44:13

标签: php mysql

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

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

1 个答案:

答案 0 :(得分:0)

我将用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