今回はPostgreSQLの重複除去、別名、算術演算、文字列連結、日付条件、型変換を復習します。取得したデータの意味を整理します。
所要時間は15分ほどです。
それでは、さっそく始めていきましょう!
今日のテーマと到達目標
学習済みの指定を組み合わせてSQLを書き、結果の1行が表す対象や、元のTableとの違いを説明することが目標です。
用語の定義
| 指定 | 役割 |
|---|---|
| DISTINCT | 選択した列の値の組み合わせについて、結果の重複を取り除く |
| AS | 結果の列に別名を付ける |
| 算術演算 | 数値の足し算や引き算などを行う |
| 文字列連結 | 複数の文字列をつなげる。今回は連結演算子を使う |
| DATEリテラル | SQLに直接書く日付の値 |
| CAST・:: | 値のデータ型を変換する |
文字列の連結演算子は||です。CAST(値 AS 型)の括弧内のASは、列の別名ではなく変換先の型を指定するために使います。
取得元はmobility.poisです。元のTableでは1行が1施設を表します。poi_idは施設ID、poi_nameは施設名、cityは所在する都市、opened_dateは開業日です。
演習①:日付条件と重複除去を組み合わせる
次の条件を満たすSQLを書きました。
- 開業日が2021年1月1日以降の施設を対象にする。
- 都市名だけを、重複を除いて取得する。
- 結果の列見出しをcity_nameにする。
- 都市名の昇順に並べ、件数は制限しない。
SELECT DISTINCT city AS city_name
FROM mobility.pois
WHERE opened_date >= DATE '2021-01-01'
ORDER BY city_name ASC;
実行結果は次の8行でした。
city_name
-----------
Ikebukuro
Kawasaki
Kichijoji
Omiya
Shibuya
Shinjuku
Tokyo
Yokohama
(8 行)
ORDER BYでは、結果の列に付けた別名city_nameを使用できました。
結果の1行は何を表すか
「1施設」と「条件に合う施設が所在する1種類の都市名」の選択問題で、後者を選びました。
元のTableは1行が1施設ですが、今回は都市名だけを選び、重複を取り除いています。そのため、この8行は施設数を示していません。
演習②:型変換と文字列連結を組み合わせる
施設名の後ろに、開業日を括弧付きで表示するSQLを書きました。開業日はDATE型なので、今回の課題では明示的にTEXT型へ変換します。
最初は連結途中にAS opened_dateを入れ、構文エラーになりました。
-- エラーになった式
poi_name || ' (' || CAST(opened_date AS TEXT) AS opened_date || ')' AS facility_label
型変換の式の直後に別名を付けてから、さらに連結しようとしていました。途中のAS opened_dateを削除し、完成した連結式の最後に別名を付けて修正しました。
SELECT
poi_id,
poi_name || ' (' || CAST(opened_date AS TEXT) || ')' AS facility_label
FROM mobility.pois
ORDER BY poi_id ASC
LIMIT 1;
修正後の実行結果は次のとおりです。
poi_id | facility_label
--------+--------------------------------
1 | Tokyo_station_001 (2021-01-15)
(1 行)
| SQLの部分 | 役割 |
|---|---|
| CAST(opened_date AS TEXT) | 開業日を文字列へ変換する |
| ' ('と')' | 表示する空白と括弧を指定する |
| AS facility_label | 連結結果の列に別名を付ける |
演習③:緯度と基準値の差を計算する
計算対象を先に整理します。
| 項目 | 定義 |
|---|---|
| 対象の単位 | 1施設 |
| poi_id | 施設を識別するID。数学的な添字ではない |
| latitude | 学習用Tableに登録された施設の緯度。単位は度 |
| 36.0 | 今回指定する基準の緯度。単位は度 |
| 計算する量 | 施設の緯度から36.0度を引いた差。単位は度 |
扱う数学的対象は数値とその差です。利用する値は合成学習データの登録値で、実測値とは扱いません。推定対象はなく、メートル単位の距離を求める計算でもありません。
SELECT
poi_id,
latitude,
latitude - 36.0 AS latitude_difference
FROM mobility.pois
ORDER BY poi_id ASC
LIMIT 1;
自分でSQLを書いて実行し、次の結果を確認しました。
poi_id | latitude | latitude_difference
--------+-----------+---------------------
1 | 35.696108 | -0.303892
(1 行)
施設IDが1の緯度35.696108度から基準の36.0度を引いた結果は、−0.303892度です。
元のTableの型や値は変わるのか
「演習②の型変換や今回の計算によって、元のTableの列の型や値は変更されるか」という確認問題には、「変更されない」と回答しました。
今回のSELECTは、変換や計算をした結果を返します。元の開業日の型や、保存されている緯度を書き換える操作ではありません。
合格条件と学習記録
| 確認項目 | 確認できた内容 |
|---|---|
| 日付条件・重複除去・別名を組み合わせられる | 都市名8行を取得 |
| 結果の1行の意味を説明できる | 1種類の都市名と回答 |
| 型変換と連結を組み合わせられる | 別名の位置を修正し、施設名と開業日を連結 |
| 算術演算と別名を指定できる | 緯度と基準値の差を取得 |
| 元データとの違いを説明できる | 元の型や値は変更されないと回答 |
まとめ
複数の指定を組み合わせるときも、それぞれの役割を分けて考えます。特に、型変換の指定と結果の別名を付ける位置を区別することが今回の復習点でした。
取得結果の1行が何を表すか、元のTableに何が保存されているかも、併せて確認します。