SQLで曜日ごとの数値を取得し、日曜から始まるように並び替えたいです。
SELECT COUNT(page) AS pageviews, FORMAT_DATE('%A',date_time) AS week FROM sample.data GROUP BY week
ORDER BY xxxxxxx
になると思うのですが、日曜から始まる並び替えのサンプルコードを見つけることが
できなく、こちらに来ました。
お手数ですが、考え方からご教示いただけますと幸いです。
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
日曜から始まる並び替えのサンプルコードを
見つけることができなく、こちらに来ました。
お手数ですが、考え方からご教示いただけますと幸いです。
- FROM句にデータセットと思しき記述がある
- FORMAT_DATE関数を利用している
- GROUP BY 句に SELECT 句のエイリアスを記述している
以上の特徴から推測すると、ご利用のデータベースはGoogle BigQuery
でしょうか。
で、sample
データセット の data
テーブルに
_DATE
型、或いはDATETIME
型のカラムが存在しており、
日曜日を起点とした1週間 で グループ化された表 をSQL
で作成したい
という解釈でいいでしょうか。
以下、コピペで即時実行できるサンプルを載せておきます。
(
共通式params
内に記述されている日付リテラル
を変更すると
結果セットも指定された範囲内のデータに置き換わります
)
SQL
1WITH params AS 2( 3 SELECT DATE '2021-09-01' _start_ -- 変更可 4 , DATE '2021-10-08' _end_ -- 変更可 5) 6SELECT row_number() over() row 7 , min( ymd ) date_from 8 , max( ymd ) date_to 9 , count(1) days 10 , array_to_string( 11 [ 12 substring( '日月火水木金土', extract( dayofweek from min( ymd ) ), 1 ) 13 , substring( '日月火水木金土', extract( dayofweek from max( ymd ) ), 1 ) 14 ] 15 , ' - ' 16 ) weekdays 17 , date_add( 18 date_sub( ymd, interval extract( dayofweek from ymd ) day ) 19 , interval 1 day 20 ) group_from 21 , date_add( 22 date_sub( ymd, interval extract( dayofweek from ymd ) day ) 23 , interval 7 day 24 ) group_to 25FROM unnest( 26 generate_date_array( 27 ( SELECT _start_ FROM params ) 28 , ( SELECT _end_ FROM params ) 29 , interval 1 day 30 ) 31) ymd 32GROUP BY group_from 33 , group_to 34ORDER BY group_from ;
■結果
row | date_from | date_to | days | weekdays | group_from | group_to |
---|---|---|---|---|---|---|
1 | 2021/09/01 | 2021/09/04 | 4 | 水 - 土 | 2021/08/29 | 2021/09/04 |
2 | 2021/09/05 | 2021/09/11 | 7 | 日 - 土 | 2021/09/05 | 2021/09/11 |
3 | 2021/09/12 | 2021/09/18 | 7 | 日 - 土 | 2021/09/12 | 2021/09/18 |
4 | 2021/09/19 | 2021/09/25 | 7 | 日 - 土 | 2021/09/19 | 2021/09/25 |
5 | 2021/09/26 | 2021/10/02 | 7 | 日 - 土 | 2021/09/26 | 2021/10/02 |
6 | 2021/10/03 | 2021/10/08 | 6 | 日 - 金 | 2021/10/03 | 2021/10/09 |
追記
2021/08/23 08:13 に返信いただいたコメントから推理した
日付を横持ちにするだけのSQL
です。
SQL
1WITH params AS 2( 3 SELECT DATE '2021-09-01' _start_ -- 変更可 4 , DATE '2021-10-08' _end_ -- 変更可 5) 6SELECT row_number() over() row 7 , max( 8 case extract( dayofweek from ymd ) when 1 then ymd end 9 ) sun 10 , max( 11 case extract( dayofweek from ymd ) when 2 then ymd end 12 ) mon 13 , max( 14 case extract( dayofweek from ymd ) when 3 then ymd end 15 ) tue 16 , max( 17 case extract( dayofweek from ymd ) when 4 then ymd end 18 ) wed 19 , max( 20 case extract( dayofweek from ymd ) when 5 then ymd end 21 ) thu 22 , max( 23 case extract( dayofweek from ymd ) when 6 then ymd end 24 ) fri 25 , max( 26 case extract( dayofweek from ymd ) when 7 then ymd end 27 ) sat 28FROM unnest( 29 generate_date_array( 30 ( SELECT _start_ FROM params ) 31 , ( SELECT _end_ FROM params ) 32 , interval 1 day 33 ) 34) ymd 35GROUP BY date_add( 36 date_sub( ymd, interval extract( dayofweek from ymd ) day ) 37 , interval 1 day 38 ) 39 , date_add( 40 date_sub( ymd, interval extract( dayofweek from ymd ) day ) 41 , interval 7 day 42 ) 43ORDER BY min( ymd ) ;
■結果
row | sun | mon | tue | wed | thu | fri | sat |
---|---|---|---|---|---|---|---|
1 | 09/01 | 09/02 | 09/03 | 09/04 | |||
2 | 09/05 | 09/06 | 09/07 | 09/08 | 09/09 | 09/10 | 09/11 |
3 | 09/12 | 09/13 | 09/14 | 09/15 | 09/16 | 09/17 | 09/18 |
4 | 09/19 | 09/20 | 09/21 | 09/22 | 09/23 | 09/24 | 09/25 |
5 | 09/26 | 09/27 | 09/28 | 09/29 | 09/30 | 10/01 | 10/02 |
6 | 10/03 | 10/04 | 10/05 | 10/06 | 10/07 | 10/08 |
日曜日を起点( 区切り )としながらも、暦上の週数で行を分割する例はこちら。
SQL
1WITH params AS 2( 3 SELECT DATE '2021-09-01' _start_ -- 変更可 4 , DATE '2021-10-08' _end_ -- 変更可 5) 6SELECT row_number() over() row 7 , format_datetime( '%Y年%m月', min( ymd ) ) yymm 8 , div( 9 extract( day from ymd ) - extract( dayofweek from ymd ) + 13 10 , 7 11 ) wnum 12 , max( 13 case extract( dayofweek from ymd ) when 1 then ymd end 14 ) sun 15 , max( 16 case extract( dayofweek from ymd ) when 2 then ymd end 17 ) mon 18 , max( 19 case extract( dayofweek from ymd ) when 3 then ymd end 20 ) tue 21 , max( 22 case extract( dayofweek from ymd ) when 4 then ymd end 23 ) wed 24 , max( 25 case extract( dayofweek from ymd ) when 5 then ymd end 26 ) thu 27 , max( 28 case extract( dayofweek from ymd ) when 6 then ymd end 29 ) fri 30 , max( 31 case extract( dayofweek from ymd ) when 7 then ymd end 32 ) sat 33FROM unnest( 34 generate_date_array( 35 ( SELECT _start_ FROM params ) 36 , ( SELECT _end_ FROM params ) 37 , interval 1 day 38 ) 39) ymd 40GROUP BY date_trunc( ymd, month ) 41 , wnum 42ORDER BY min( ymd ) ;
■結果
row | yymm | wnum | sun | mon | tue | wed | thu | fri | sat |
---|---|---|---|---|---|---|---|---|---|
1 | 2021年9月 | 1 | 09/01 | 09/02 | 09/03 | 09/04 | |||
2 | 2021年9月 | 2 | 09/05 | 09/06 | 09/07 | 09/08 | 09/09 | 09/10 | 09/11 |
3 | 2021年9月 | 3 | 09/12 | 09/13 | 09/14 | 09/15 | 09/16 | 09/17 | 09/18 |
4 | 2021年9月 | 4 | 09/19 | 09/20 | 09/21 | 09/22 | 09/23 | 09/24 | 09/25 |
5 | 2021年9月 | 5 | 09/26 | 09/27 | 09/28 | 09/29 | 09/30 | ||
6 | 2021年10月 | 1 | 10/01 | 10/02 | |||||
7 | 2021年10月 | 2 | 10/03 | 10/04 | 10/05 | 10/06 | 10/07 | 10/08 |
投稿2021/08/22 21:02
編集2021/08/23 09:46総合スコア335
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/22 23:13
2021/08/23 00:33
2021/08/24 13:10
0
SQLタグだけではどのデータベースかわかりません。MySQLでしたら、
DATE_FORMAT関数およびTIME_FORMAT関数関数の使い方 を熟読してSQLを実行しては?
投稿2021/08/22 13:46
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。