之前有討論過,訂雞腿與排骨便當的案例.這次是兩家聯合的訂餐中心,
開放預訂的時間是 9:00~11:30, 想要做每15分鐘為一區間,來做統計,
最後來個全部統計.
測試資料如下:
create table booking (
qty int
, ts timestamp
);
insert into booking
select ceil(random() * 4)
, timestamp '2023-10-11 09:00:00' + interval '1 minute' * ceil(random() * 150)
from generate_series(1,100);
insert into booking
select ceil(random() * 4)
, timestamp '2023-10-11 10:00:00' + interval '1 minute' * ceil(random() * 60)
from generate_series(1,60);
預期結果:
因為使用亂數產生資料,數值會不一樣是很正常的.
大家來玩看看吧.有人有意見.那改挑戰看看吧.
沒用case,也沒用union, 只用了一次 group by.
使用 date_bin() 函數的方式
select date_bin(interval '15 minutes', ts, timestamp '2023-10-11 09:00:00') as bin
, count(*) as cnt
, sum(qty) as sumqty
from booking
group by rollup(bin)
order by bin nulls last;
WITH TimeIntervals AS (
SELECT
date_trunc('hour', ts) + interval '15 minutes' * floor(extract(minute from ts) / 15) AS interval_start,
qty
FROM booking
)
SELECT
CASE WHEN interval_start IS NOT NULL THEN to_char(interval_start, 'YYYY-MM-DD HH24:MI:SS') ELSE 'NULL' END AS ts_min,
COUNT(qty) AS cnt,
SUM(qty) AS sumqty
FROM TimeIntervals
GROUP BY ROLLUP (interval_start)
ORDER BY interval_start;
結果:
ts_min | cnt | sumqty |
---|---|---|
2023-10-11 09:00:00 | 11 | 22 |
2023-10-11 09:15:00 | 13 | 37 |
2023-10-11 09:30:00 | 6 | 20 |
2023-10-11 09:45:00 | 7 | 16 |
2023-10-11 10:00:00 | 24 | 62 |
2023-10-11 10:15:00 | 24 | 56 |
2023-10-11 10:30:00 | 23 | 58 |
2023-10-11 10:45:00 | 31 | 84 |
2023-10-11 11:00:00 | 11 | 30 |
2023-10-11 11:15:00 | 10 | 19 |
cnt | sumqty |
---|---|
160 | 404 |
Google 到的答案, 難度微低...
db fiddle
貼了才看到漏掉最後一筆總計
我不會
SELECT date_trunc('hour', ts) + (floor(date_part('minute', ts) / 15) * interval '15 minute') AS ts_min, COUNT(*) cnt, sum(qty) sumqty
FROM booking
GROUP BY ts_min
order by ts_min
SELECT date_trunc('hour', ts) + (floor(date_part('minute', ts) / 15) * interval '15 minute') AS ts_min,
COUNT(*) cnt, sum(qty) sumqty
FROM booking
GROUP BY cube (ts_min)
order by ts_min
PostgreSQL 14版之後引進了一個函數 date_bin().
這裡有參考的例子
https://www.commandprompt.com/education/how-to-use-date_bin-function-in-postgresql/
使用 date_bin() 會比較方便些.
目前的資料是每個時段都有資料,所以都能顯示出來.
但,就是這個但~~~ 若該時段沒有資料,但還是要顯示該時段,
然後用 coalesce(count(*),0)
這類的方式來顯示.
把頭像屏蔽
加上思想通緝犯、紅字與刪除線
新增封殺按鈕
版面通知封殺名單與文章數
透過ajax確認某id的最新ID
如果有個思想審查警衛可以:去除那些垃圾低端,稱不上技術文章的雜訊。
以確保未來瀏覽文章的時候,不會再被洗文打擾,
也可以針對不喜歡的主題去封鎖,讓時間與精神更能專注於自己想要學的資訊。
阻止一些垃圾就是喜歡把自己尚未整理的白痴內容一直丟上來,
什麼都還不懂,把技術文章當成個人日記簿,寫一堆自我囈語、無病呻吟,
每天大量狂發文章,昭告天下以為這就是努力,欺騙自己也浪費別人的人生。
我覺得如同"㊣浩瀚星空㊣ "所說,也許是個不錯的討論。
這邊只是提供另一個有趣的腳本,
讓各位參考,
並非針對IT幫朋友任何一位,我認為發問都是好事!希望大家多多討論!!
https://greasyfork.org/zh-TW/scripts/477283-%E6%80%9D%E6%83%B3%E7%8A%AF%E5%B0%81%E6%AE%BA