トランザクションデータを、ある区間の日付ごとに集計したいということがまれに良くあります。 「2016年の一ヶ月ごとの売上平均を出したい」「週ごとのアクセス合計を出したい」などです。 SQLのWITH句を使ってやると上記のような集計を簡単にできます。 以下、PostgreSQLで利用する場合(MySQLでは使えませんが、MySQL8.0からWITH句がサポートされるという話です) WITH句を使った期間一時テーブル WITH句による再帰SQLを使うことで、任意の期間を任意の幅で簡単に得ることができます WITH RECURSIVE date_range(i, start_date, end_date) AS ( SELECT 1, date '2016-01-01', date '2016-01-31' UNION ALL SELECT i + 1 , date (start_date +
MySQLしか触った事のない人にとっては全く知らない文法だというとこを最近知ったので。 WITH句とは WITH句は、ネストされたテーブルに別名をつけて読みやすくするために使用する構文。 PostgreSQL, Oracle, MS SQL Serverなどで使用可能。 MySQLは(少なくとも少し前のバージョンでは)対応していない。 -- ネストされたテーブル SELECT * FROM ( SELECT user_id, SUM(payment) AS total_payment FROM payments GROUP BY user_id ) a WHERE a.total_payment > 3000 この例だとHAVINGすればいいとかはひとまず無視して、WITHを使うとこんな感じ。 WITH a AS ( SELECT user_id, SUM(payment) AS tota
postgresqlを使用した案件にてサブクエリを最大5つ使用するSQLを作成していたが条件項目が多くレスポンスでよい結果がでないこともあり、そこでwith句を使用することにした。 PostgreSQLのドキュメントには以下のように書かれています。 https://www.postgresql.jp/document/9.5/html/queries-with.html WITHは、より大規模な問い合わせで使用される補助文を記述する方法を提供します。 これらの文は共通テーブル式(Common Table Expressions)またはCTEとよく呼ばれるものであり、1つの問い合わせのために存在する一時テーブルを定義すると考えることができます。 WITH句内の補助文はそれぞれselect、INSERT、updateまたはDELETEを取ることができます。 そしてWITH句自身は、これもSEL
WITH句を使えば1つの副問い合わせ(SQL)を複数の箇所で使いまわすことができます。 例としてSQL 副問い合わせの基本を理解するで扱ったFROM句の副問い合わせのSQLをおさらいします。 SELECT MAX(T1.社員名) AS 社員名 ,SUM(T2.売上金額) AS 確定売上金額 ,SUM(T3.売上金額) AS 未確定売上金額 FROM 社員マスタ AS T1 LEFT JOIN ( SELECT * FROM 売上明細 S1 WHERE 状態区分 = 0 ) T2 ON T1.社員コード = T2.社員コード LEFT JOIN ( SELECT * FROM 売上明細 S1 WHERE 状態区分 = 1 ) T3 ON T1.社員コード = T3.社員コード GROUP BY T1.社員コード ※今回は学習のために上記のようなわかりやすいSQLを例にしましたが、SQL CA
7.8. WITH問い合わせ(共通テーブル式)WITHは、より大規模な問い合わせで使用される補助文を記述する方法を提供します。 これらの文は共通テーブル式またはCTEとよく呼ばれるものであり、1つの問い合わせのためだけに存在する一時テーブルを定義するものと考えられます。 WITH句内の補助文はそれぞれSELECT、INSERT、UPDATEまたはDELETEを取ることができます。 そしてWITH句自身は、これもSELECT、INSERT、UPDATEまたはDELETEを取ることができる主文に付与されます。 7.8.1. WITH内のSELECTWITH内のSELECTの基本的な価値は、複雑な問い合わせをより単純な部品に分解することです。 以下に例を示します。 WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales
環境 MAC OSX 10.10.5 Yosemite 使い方(例) テーブルの準備 CREATE TABLE items ( id SMALLINT , name VARCHAR(16) , item_id SMALLINT , item_name VARCHAR(16) , PRIMARY KEY(id, item_id) ); INSERT INTO items VALUES (1, '文房具', 1, 'シャーペン') , (1, '文房具', 2, '消しゴム') , (1, '文房具', 3, '定規') , (2, 'かばん', 1, 'リュックサック') , (2, 'かばん', 2, 'ショルダーバッグ'); CREATE TABLE genre ( id SMALLINT , name VARCHAR(16) ,PRIMARY KEY(id) ); # SELECT *
NTT オープンソースソフトウェアセンタ 板垣 貴裕 共通表式 WITH 句と再帰SQL (WITH RECURSIVE) は PostgreSQL 8.4 の新機能です。WITH と WITH RECURSIVE それぞれの説明と、実際の利用例として再帰クエリを使ったロック競合解析の方法を解説します。 共通表式 WITH 句 あるクエリの中で他のクエリの結果を使う方法には、既にサブクエリがあります。WITH 句は、サブクエリの結果に名前をつけ、クエリの複数の箇所からその結果を参照するための構文です。そのクエリの中だけで使用できる一時表 (TEMP TABLE) を作るのに近い動作になります。 利用例としては、あるサブクエリの結果を複数の列と比較する場合が挙げられます。例えば以下のように、表 keyword_list から取得した結果を、表 document の keyword1, key
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く