• 日本語
    • English (英語)
Avinton JapanAvinton JapanAvinton JapanAvinton Japan
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ

SQL 便利な関数

  • ルーティング
  • データベースの命名規則
  • 三目並べ – 2.〇×を交互にゲーム盤に入るようにしよう
  • 三目並べ – 3.勝敗がつくようにしよう
  • クリーンコード(Clean Code)
  • 三目並べ – 4.「スタート」「リセット」ボタンをつけよう
  • 三目並べ – 5.先攻後攻を決めて、コンピュータ対戦にしよう(前編)
  • インフラストラクチャー(サーバー、コンポーネント、RAID)
  • 機械学習入門者向け Support Vector Machine (SVM) に触れてみる
  • YOLOv8を用いた物体検出
  • 正規表現とパイプ
  • 機械学習エンジニアに必要なスキル
  • 軽量版Kubernetesディストリビューション – k0s クラスターの構築
  • ファイル操作コマンド
  • グループとユーザー
  • 困った時に使うコマンド
  • 一般グループのユーザーとグループ
  • プライバシーポリシー
  • 三目並べ – 6.先攻後攻を決めて、コンピュータ対戦にしよう(後編)
  • フロントエンド開発のための環境構築
  • ファイル検索コマンド
  • 質問
  • 仮想化環境のディスク容量を拡張する
  • ユーザー権限とアクセス権
  • データ分析基礎 – Part1
  • 三目並べ – 0.導入
  • テキスト処理
  • データベースへのデータロード
  • 機械学習概要1
  • 機械学習入門者向け Naive Bayes(単純ベイズ)アルゴリズムに触れてみる
  • ファイル管理
  • SSHを使用してホストOSからゲストOSに接続する
  • 機械学習入門者向け ChainerRLでブロック崩しの学習
  • 機械学習入門者向け ランダムフォレストによる Kaggle Titanic生存者予測
  • 機械学習概要2
  • データ分析基礎 – Part 2
  • 機械学習入門者向け 分類と回帰の違いをプログラムを書いて学ぼう
  • フロントエンドのWeb開発について
  • ダイナミックルーティング
  • 三目並べ – 1.ゲーム盤を作ろう
  • 【Python入門】Python Numpy チュートリアル
  • Amazon EC2 インスタンスの初期設定をしよう
  • AmazonEC2とVPCでネットワークとサーバーを構築しよう
  • Apache NiFi Exercise
  • Apache NiFi データパイプライン基礎
  • Apache NiFiの環境設定
  • Apache Spark 基礎
  • Apache SparkとApache Zeppelinの概要と環境構築
  • Apache Superset maptoolの使い方
  • Apache Superset 基礎
  • Apache Superset 概要と環境構築
  • Apache Zeppelin 基本機能
  • APIのデモンストレーション
  • Avinton Academy コンテンツガイド
  • AWS CLIをインストールしてコマンド操作しよう
  • AWS CLIを使ってEC2のファイルをS3へアップロードしよう
  • AWS Route 53を使って独自ドメインのWebページを表示させてみよう
  • AWSアカウントの作成と必ずやるべきセキュリティ対策
  • AWSのEC2インスタンスでWordPressブログを公開してみよう
  • AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
  • CCNA
  • Certbotを使ってSSL証明書を発行し、HTTP通信を暗号化しよう
  • CISCO 1800ルータセットアップ
  • CSV import & export – Node.js, mySQL – 1
  • CSV import & export – Node.js, mySQL – 2
  • Docker Compose(Nginx + Flask + MySQL)演習
  • Docker Engineのubuntu上へのinstall
  • Docker 概要とセットアップ
  • Docker, Kubernetesの学び方について
  • Dockerコンテナイメージの最適化/ベストプラクティス
  • DockerとApacheを使ってWebサーバーを構築しよう
  • EC2からS3へ自動でぽいぽいアップロードするスクリプトの作成
  • ESP32-CAMのサンプルアプリケーションを実行する
  • 01 – Sparkfun Inventor’s Kit の準備
  • 02 – Sparkfun Inventor’s KitでLチカ
  • 03 ポテンショメータでLEDの点滅間隔をアナログ入力する
  • 04 フォトレジスタで明るさに反応するシステムをつくる
  • 05 LCDに文字列を表示する
  • 06 – BME280とLCDを組み合わせて温度計をつくる
  • ESP32とArduino IDE/PlatfromIOでHello Worldアプリケーションの実行
  • ESP32と超音波センサー HC-SR04 で物体の距離を計測する
  • ESXi – Switchの追加とVLAN
  • ESXi – VyOS
  • ESXi – 小規模ネットワーク 構築
  • Gitとは
  • VS CodeでGitHub Copilotを設定する
  • VSCode リモート開発環境
  • GNS3のセットアップ
  • Kubernetesクラスター上へのOpenVINOモデルサーバーを使用したサンプルアプリケーションのデプロイ
  • Linuxとは
  • NAT
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – React編
  • NodeJSでWebアプリケーション開発 – Socket.IO編
  • NVIDIA Cumulus VX + GNS3でBGPネットワークのシミュレーション
  • OpenCVのテストプログラム
  • PacketTracerのセットアップ
  • Pandasによる構造化データ分析
  • PCからルータ、スイッチへのSSH接続設定
  • PostGIS exercise
  • PostgreSQL – Python – Apache – Bootstrap
  • MySQLとMySQL Workbench のセットアップ
  • PostgreSQL Setup
  • PostgreSQL – インデックスを利用したパフォーマンス改善方法
  • PostgreSQL – パーティショニングを利用したパフォーマンス改善方法
  • PostgreSQLによるデータ分析
  • postgreSQLへのshp fileのimport
  • Python2.7とOpenCVのインストール
  • Python3.8 と OpenCV のインストール (Ubuntu20.04LTS)
  • Pythonでデータベースを操作する
  • Pythonで画像を分類するプログラムを作成する
  • Pythonによるマルチスレッドプログラミング実践
  • Raspberry Pi 4B のセットアップ
  • Raspberry PiとBME280を使用して温度と湿度、気圧を読み取る
  • REDIS
  • Redux基礎 – 主要な概念と用語
  • Ruby on Rails を MySQLでセットアップ
  • Ruby on Railsによる簡単なウェブアプリケーション
  • SampleアプリケーションのKubernetes上へのデプロイ
  • Scala 基礎
  • scikit-learnとは
  • Spark SQL エクササイズ
  • SparkMLによるKaggle Titanic生存者予測
  • SparkMLによる住宅価格予測
  • SQL 便利な関数
  • Ubuntuの基本設定
  • uhubctlでUSBデバイスのオンオフをコントロール
  • Terraform入門 2 – Terraformのstate管理
  • Terraform入門 1 – TerraformでAWS上にEC2インスタンスを作成する
  • Virtualisation and Container (仮想化とコンテナ) – Ansible, Docker and Kubernetes
  • viエディタ
  • VLAN
  • VMware ESXi サーバー構築
  • Webアプリ開発に欠かせないGoogle Chrome DevToolsの基本
  • Windows Server 2012 R2 Hyper-V
  • YOLOv5を用いた物体検出
Home Avintonアカデミー SQL 便利な関数
SQL logo

WITH 構文

入れ子構造はSQL文では頻出ですが、基本的に読みづらいです。

1
2
3
4
5
6
7
8
9
10
11
SELECT t1.title, t3.actor_name
FROM film as t1
LEFT JOIN (
SELECT film_id, actor_id
FROM film_actor) AS t2
ON t1.film_id = t2.film_id
LEFT JOIN (
SELECT actor_id, first_name || ' ' || last_name AS actor_name
FROM actor) AS t3
ON t2.actor_id = t3.actor_id
ORDER BY t1.title, t3.actor_name

WITH構文を使うことで、入れ子の中身(サブクエリ)をSQL文の先頭に持ってくることができます。これによって、SQL文の先頭から(自然な流れで)中身を追うことができます。

1
2
3
4
5
6
7
8
9
10
WITH
t2 (film_id, actor_id)
AS (SELECT film_id, actor_id FROM film_actor),
t3 (actor_id, actor_name)
AS (SELECT actor_id, first_name || ' ' || last_name AS actor_name FROM actor)
SELECT title, actor_name
FROM film as t1
LEFT JOIN t2 ON t1.film_id = t2.film_id
LEFT JOIN t3 ON t2.actor_id = t3.actor_id
ORDER BY t1.title, t3.actor_name

WITH RECURSIVE 構文

再帰的にテーブルを結合することができます。
例えば、1から10までを昇順に表示させるSQL文は以下のように書けます。

1
2
3
4
5
6
WITH RECURSIVE seq(i) AS (
SELECT 1
UNION ALL
SELECT i + 1 FROM seq WHERE i < 10
)
SELECT i FROM seq;

使いどころとしては、階層構造を持ったテーブルを扱うケースが考えられます。

GROUPING SETS 構文

例えば、各部署において日次売り上げデータを格納したテーブルがあり、会社全体の日ごとのトータルの売り上げと、月ごとのトータルの売り上げを同時に1つのテーブルで表現したい場合、

1
2
3
4
5
6
7
8
9
10
SELECT
month,
day,
sum(sales)
FROM t1
GROUP BY
GROUPING SETS (
(month, day),
(month)
)

のように書くことができます。

WINDOW 関数

同じキーを持つレコードをマージするには、
・GROUP BY
・DISTINCT
の2つの方法が挙げられます。
集約関数(sum, maxなど)を使うにはGROUP BYでキーを集約させる必要があります。
キーをマージさせずに、集約させるにはどうすれば良いでしょうか。
1つの方法としては、サブクエリを用いて元のテーブルと集約させたテーブルを結合させる方法があります。

1
2
3
4
5
6
WITH t1 (customer_id, total_amount)
AS (SELECT customer_id, SUM(amount) FROM payment GROUP BY customer_id)
SELECT payment.customer_id, amount, total_amount
FROM payment
JOIN t1 ON (payment.customer_id = t1.customer_id)
ORDER BY payment.customer_id, amount;

しかし、この方法は見づらく、メンテナンスしづらいのが問題です。
ここでWINDOW 関数を用いてみましょう。

1
2
3
4
5
6
SELECT
customer_id,
amount,
SUM(amount) OVER(PARTITION BY customer_id) AS total_amount
FROM payment
ORDER BY customer_id, amount;

もう少し簡単な例を見てみましょう。

id price
1 100
2 100
2 100
3 100
3 100
3 100
3 100

上記のテーブルt1に対し、priceの総和を含む列を追加します。

1
2
3
4
5
SELECT
id,
price,
SUM(price) OVER() AS total
FROM t1

id price total
1 100 600
2 100 600
2 100 600
3 100 600
3 100 600
3 100 600
3 100 600

各idごとの総和を含む列を追加するためには、PARTITION BY句 を使います。

1
2
3
4
5
SELECT
id,
price,
SUM(price) OVER(PARTITION BY id) AS total
FROM t1

id price total
1 100 100
2 100 200
2 100 200
3 100 400
3 100 400
3 100 400
3 100 400

次にORDER BY句を使った別の例を見てみましょう。

day price
1 +30
2 +50
3 +20
4 -10
5 -80
6 +70
7 -40

上記のテーブルt1において、価格(price)の日(day)ごとの推移を含む列を追加するとします。方法の1つとしては、スカラサブクエリを用いることです。

1
2
3
4
5
SELECT
day,
price,
(SELECT SUM(price) FROM t1 AS t2 WHERE t2.day <= t1.day) AS balance
FROM t1

day price balance
1 +30 +30
2 +50 +80
3 +20 +100
4 -10 +90
5 -80 +10
6 +70 +80
7 -40 +40

さらに、WINDOW関数を用いる方法があります。結果は同じです。

1
2
3
4
5
6
7
SELECT
day,
price,
SUM(price) OVER (
ORDER BY day ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
FROM t1

OVER (ORDER BY)句で使える関数には、様々な種類があります。
ここで順位を取得する関数いくつかの例を示します。

i ROW_NUMBER RANK DENSE_RANK
1 1 1 1
2 2 2 2
2 3 2 2
4 4 4 3

列iに対し、その他の列は順位を示しています。使用する関数により、順位のつき方が異なります。

OVER句は
1. 移動平均
2. ランキング
3. 自己結合の回避(LAG関数など)
など、様々な実用例が考えられます。

NULL値のソート順制御

デフォルトでは、NULL値はソートの先頭(DBによっては末尾)に来ますが、NULLS FIRST (LAST)句を使うことで、順序を制御できます。

1
2
3
SELECT ...
FROM ...
ORDER BY nullable NULLS FIRST

この場合、NULL値があれば、ソートの先頭に来ます。

FILTER 句

列yearに年、列monthに月を持つテーブルt1を考えます。

year month sales
2018 10 200
2018 11 300
2018 12 800
2019 1 600
2019 2 400
2019 3 300

このテーブルを変形し、行方向に年、列方向に月を持つピボットテーブル

year Jan Feb Mar … Oct Nov Dec
2018 … … … … 200 300 800
2019 600 400 300 … … … …

を作成したい場合、

1
2
3
4
5
6
7
SELECT
year,
SUM(CASE WHEN month = 1 THEN sales END) as Jan,
SUM(CASE WHEN month = 2 THEN sales END) as Feb,
...
FROM t1
GROUP BY year;

のようにCASE句を駆使する方法があります。
これをFILTER句を使用することで書き換えることができます。

1
2
3
4
5
6
7
SELECT
year,
SUM(sales) FILTER (WHERE month = 1) Jan,
SUM(sales) FILTER (WHERE month = 2) Feb,
...
FROM t1
GROUP BY year;

パーセンタイル

ある列の中央値を取得する場合、テーブルを自己結合させることによって求める方法がありますが、現在では、パーセンタイル関数を使用することにより簡単に求めることができます。

1
SELECT PERCENTILE_DISC (0.5) WITHIN GROUP (ORDER BY sales) FROM t1

FETCH FIRST

SQL標準の「最初のN行のみ選択するクエリ」です。LIMITやTOP句のような働きをします。

1
2
3
4
SELECT *
FROM t1
ORDER BY sales
FETCH FIRST 10 ROWS ONLY;

この場合、最初の10行のみを取得します。

OFFSETは非推奨

ページネーションを考える際、次ページ以降を取り出す方法は2つ考えられます。
1. OFFSETを用いて対象ページより前のページをスキップして取得
2. 最後のエントリの1つあとに来るべき値を用いて取得
1の方法のデメリットは2つあり、
(i)新しいレコードが挿入された場合、ページがずれること
(ii)後ろのページを検索するほど、処理時間が長くなること
です。
2の方法では、where句を用いてシンプルに実現できます。

1
2
3
4
5
SELECT *
FROM sales
WHERE sale_date < [target_date]
ORDER BY sale_date DESC
FETCH FIRST 10 ROWS ONLY

OVER

例えば直前の行との差を取る場合、自己結合を用いる方法がありますが、現在ではLAG関数によりシンプルに実現可能です。

1
2
3
4
5
6
SELECT
*,
amount - COALESCE(
LAG(amount) OVER(ORDER BY payment_id)
, 0)
FROM payment

他にも、1つ先の行を取得するLEADや、最初と最後の値を取得するFIRST_VALUE/LAST_VALUE、任意のn番目の行を取得するNTH_VALUE関数があります。

採用情報

採用情報

Categories

  • 相互学習
  • 採用
  • 社員インタビュー
  • 学習&資格取得
  • 技術解説
  • イベント告知
  • 学内説明会&講義
  • 産学連携
  • 就職活動
  • イベントレポート
  • その他
  • 技術ブログ&インタビュー
  • mainpage
  • New Graduates Interviews
  • 中途エンジニア
  • カテゴリーなし
  • ニュースリリース&イベント

Avinton SDGs

SDGsへの貢献

Search

タグ

AIエンジニア AI導入 Apatch AvintonAcademy CKA DevOps KiX Kubernetes Notion PM&PMO PyTorch SDGs Innnovation Hub UI YOLOv5 アカウントマネージャー インタビュー インフラエンジニア エッジAIカメラ セキュリティエンジニア ソフトスキル ツール開発 データサイエンティスト ネットワークエンジニア フルスタックエンジニア フロントエンド ベテランエンジニア ボランティア マイクロサービス モーフィング ローカルイベント 中瀬幸子、サーバークラスター 中途採用 人材育成 協働パートナー 国際自動制御連盟 地域創生 基本情報技術者 強化学習 技術 新卒、キャリア 新卒採用 田中研之輔 社会貢献 経団連 顔認証
© 2023 Avinton | All Rights Reserved | プライバシーポリシー
  • サービス
    • Avinton Data Platform
    • エッジAIカメラ
      • 自動車ナンバープレート自動認識システム
    • プライベートクラウド
    • AIサービス開発
    • AIカメラ/画像解析無料体験版
  • 最新情報
    • ニュースリリース&イベント情報
    • 技術ブログ&インタビュー
  • アカデミー
    • Avintonアカデミー
    • Academy on Campus
    • Academy with Platform
  • 採用情報
    • Avintonジャパン 採用ページ
    • 求人一覧
    • よくある質問
    • 新卒採用
  • 企業情報
    • 会社概要
    • 代表からご挨拶
    • SDGsへの貢献
  • お問い合わせ
  • 日本語
    • English (英語)
Avinton Japan