假設我有一個賭注表,金額(小數)和創建時間戳(timestamp),我怎樣才能在24小時內選擇最高賭注金額(例如,最大投注金額的24小時並選擇那個總和?)MySQL中的高峯賭注
我是MySQL的經驗,但不知道如何處理這種情況。
假設我有一個賭注表,金額(小數)和創建時間戳(timestamp),我怎樣才能在24小時內選擇最高賭注金額(例如,最大投注金額的24小時並選擇那個總和?)MySQL中的高峯賭注
我是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
有沒有辦法用vanilla SQL來做到這一點?我正在使用maria數據庫,並試圖安裝postgresql只是爲了運行這個單一的查詢。 – user2714596
由於某種原因,所有的總和返回0 – user2714596
沒關係我很笨,謝謝!!!! – user2714596
假設您有100個賭注。 50從昨天開始,50從今天開始,你只需要從昨天開始的最高賭注?什麼是總和? – JGutierrezC
我需要最高總額的期間,而不是最高的投注額,可能會有200單注或0.0001的投注 – user2714596
答案取決於您想要的粒度。你想在1天的粒度24小時內達到最高金額? (我們不關心哪個小時有最大值。)您想要在24小時內以1小時的間隔計算最大金額嗎? (我們不關心那個小時哪個*分鐘有最大值)你想在24小時內以1分鐘爲間隔的最大值嗎? (我們不關心那個小時中哪個*秒有最大值)同上秒,毫秒等 –