iT邦幫忙

8

趣味SQL又來了 這次來統計時段訂便當

  • 分享至 

  • xImage
之前有討論過,訂雞腿與排骨便當的案例.這次是兩家聯合的訂餐中心,
開放預訂的時間是 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);

預期結果:
https://ithelp.ithome.com.tw/upload/images/20231012/20050647snIQadcV2f.png

因為使用亂數產生資料,數值會不一樣是很正常的.
大家來玩看看吧.有人有意見.那改挑戰看看吧.
沒用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;

看更多先前的討論...收起先前的討論...
sd3388 iT邦好手 1 級 ‧ 2023-10-12 16:15:13 檢舉
這邊是來給大家發問的
不是來"玩玩看"
GPT也能解?
TO:sd3388
這是這邊的傳統。我有時也會發一篇來給人家「玩玩看」
都是技術性的討論。
這裏並未限制一定得要「發問」才能發文。
有時也會有一些高手們會提出一些議題,來讓大家討論看看。

你這樣的留言會扼殺高手們及一些想學東西的人。

這只是借用了「玩玩看」的名義來討論。並非是與技術不相關的發言。
沒那個必要講話那麼衝。
sd3388也是出於好意,可能沒注意到以前會有這類型態的討論吧.畢竟這種討論較少.
sd3388 講得滿有道理的其實XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
咖咖拉
iT邦好手 1 級 ‧ 2023-10-12 16:44:44
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

https://ithelp.ithome.com.tw/upload/images/20231012/201102922MdnFpeuP0.png

2
海綿寶寶
iT邦大神 1 級 ‧ 2023-10-12 16:52:45

Google 到的答案, 難度微低...
db fiddle

貼了才看到漏掉最後一筆總計
我不會
/images/emoticon/emoticon05.gif

https://ithelp.ithome.com.tw/upload/images/20231012/20001787yUcFo1SNcV.png

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 
看更多先前的回應...收起先前的回應...
咖咖拉 iT邦好手 1 級 ‧ 2023-10-12 17:01:07 檢舉

11:30 也算嗎XDD

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) 這類的方式來顯示.

0
Oo_花之舞__oO
iT邦新手 1 級 ‧ 2023-10-13 14:10:29

前端小試身手(8)

前端小試身手-「思想審查警衛」,過濾垃圾雜訊的利器!

功能

把頭像屏蔽
加上思想通緝犯、紅字與刪除線
新增封殺按鈕
版面通知封殺名單與文章數
透過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

我要發表回答

立即登入回答