質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.45%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2279閲覧

日曜から始まる並べ替えの方法

midori_saki

総合スコア29

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/08/22 12:21

SQLで曜日ごとの数値を取得し、日曜から始まるように並び替えたいです。

SELECT COUNT(page) AS pageviews, FORMAT_DATE('%A',date_time) AS week FROM sample.data GROUP BY week

ORDER BY xxxxxxx
になると思うのですが、日曜から始まる並び替えのサンプルコードを見つけることが
できなく、こちらに来ました。

お手数ですが、考え方からご教示いただけますと幸いです。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2021/08/23 08:37

Oracle Databaseの開発で汎用機のCOBOL屋さんが長かったメンバーがテーブル設計で _ アンダーバー ではなく、 - ハイフン を使いたがる人でテーブル名や列名をダブルクォーティングしないと使えないので困った事があります。
guest

回答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 ;

 
■結果

rowdate_fromdate_todaysweekdaysgroup_fromgroup_to
12021/09/012021/09/044水 - 土2021/08/292021/09/04
22021/09/052021/09/117日 - 土2021/09/052021/09/11
32021/09/122021/09/187日 - 土2021/09/122021/09/18
42021/09/192021/09/257日 - 土2021/09/192021/09/25
52021/09/262021/10/027日 - 土2021/09/262021/10/02
62021/10/032021/10/086日 - 金2021/10/032021/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 ) ;

 
■結果

rowsunmontuewedthufrisat
109/0109/0209/0309/04
209/0509/0609/0709/0809/0909/1009/11
309/1209/1309/1409/1509/1609/1709/18
409/1909/2009/2109/2209/2309/2409/25
509/2609/2709/2809/2909/3010/0110/02
610/0310/0410/0510/0610/0710/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 ) ;

 
■結果

rowyymmwnumsunmontuewedthufrisat
12021年9月109/0109/0209/0309/04
22021年9月209/0509/0609/0709/0809/0909/1009/11
32021年9月309/1209/1309/1409/1509/1609/1709/18
42021年9月409/1909/2009/2109/2209/2309/2409/25
52021年9月509/2609/2709/2809/2909/30
62021年10月110/0110/02
72021年10月210/0310/0410/0510/0610/0710/08

投稿2021/08/22 21:02

編集2021/08/23 09:46
mayu-

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

midori_saki

2021/08/22 23:13

ご回答ありがとうございます。 はい、BigQueryです。 私の伝え方がよくなかったようでして、各曜日(日曜日だけ、土曜日だけ、金曜日だけ、木曜日だけ、....)と曜日ごとに分け、日曜から始まるように列を並び替えたいという希望です。 申し訳ありませんが、再度ご教示いただけますでしょうか。
mayu-

2021/08/23 00:33

特定範囲の日付1列のみで構成されている表から作成可能な 横持ちの結果セットといえば ... 「カレンダー」ということでしょうか。 推理した SQL と結果セットを回答に追記しておきます。
midori_saki

2021/08/24 13:10

新しい回答を追加いただき、ありがとうございました。 大変お手数おかけしました。 いただいたコードを参考に、自分でも書いてみます!
guest

0

SQLタグだけではどのデータベースかわかりません。MySQLでしたら、

DATE_FORMAT関数およびTIME_FORMAT関数関数の使い方 を熟読してSQLを実行しては?

投稿2021/08/22 13:46

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.45%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問