(2021/3/21 12-18が2件、2021/3/28 12-18が3件、というイメージ)
上記を出力のイメージとし、
特定の期間の、特定の曜日の、特定の時間のデータを抽出し
上記を抽出条件とした場合のSQLを考えてみます。
別名カラムは式に直接使えないらしいので
ネストさせれば使えます。
可読性の為に、先ずは目的に応じた編集を先に行い、次に条件や集計を行うようにしています。
ここでは時間帯を6時間ごとのグループにする編集を行っています。
取り敢えず条件部分はわざとコメントにしていますので、適宜利用して下さい。
SQL
1select active_date, active_day, active_timezone, count(*) as cnt
2from (
3 select *
4 , to_date(substr(active, 1, 8), 'YYYYMMDDHH') AS active_date -- 日付
5 , to_char(to_date(substr(active, 1, 8), 'YYYYMMDDHH'), 'TMDy') AS active_day -- 曜日
6 , to_char(substr(active, 9, 6)::integer,'FM00:00:00')::time AS active_time -- 時間
7 , case substr(active, 9, 2)::integer / 6
8 when 0 then '00-06'
9 when 1 then '06-12'
10 when 2 then '12-18'
11 when 3 then '18-24'
12 end AS active_timezone -- 時間帯
13 , to_timestamp(substr(active, 1, 20), 'YYYYMMDDHH24MISSUS') AS active_timestamp -- タイムスタンプ
14 from (values
15 (1,'2021040112000000000000')
16 ,(2,'2021040113000000000000')
17 ,(3,'2021040319000000000000')
18 ,(4,'2021040516000000000000')
19 ) as hoge_db(no, active)
20) edit
21/*
22where active_date between '2021/04/01' and '2021/04/05'
23 and active_day in ('月','木','土')
24 and active_time between '12:00:00' AND '17:59:59'
25*/
26group by active_date, active_day, active_timezone
27order by active_date, active_timezone
元の文字列は「2021040112000012345678」のような22桁の文字列です。
という事なので、桁数的に不明な部分がありますので、20桁が’YYYYMMDDHH24MISSUS’だとして、必要な桁のみをsubstrでピックアップする事にしています。