SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

分析関数の衝撃

PostgreSQLの分析関数の衝撃(7)
――window関数の変わった使用例

order by句でのwindow関数など

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (1.3 KB)

2. update文でwindow関数の値に更新

 次は、update文でwindow関数の値に更新する方法についてです。サンプルを見てみましょう。

updateOLAP
ID Val seq
1 100 null
1 300 null
1 700 null
2 200 null
2 400 null
2 800 null
3 500 null

 seq列をIDごとのValの昇順での(Row_Numberな)順位にupdateしてみます。

update文でwindow関数の値に更新
update updateOLAP a
set seq = b.rn
from (select ID,Val,
      Row_Number() over(partition by ID order by Val) as rn
        from updateOLAP) b
where a.ID=b.ID
  and a.Val=b.Val;
更新結果
ID Val seq
1 100 1
1 300 2
1 700 3
2 200 1
2 400 2
2 800 3
3 500 1

 『PostgreSQLのマニュアル UPDATE』をふまえて、from句でwindow関数を使用したインラインビューを記述して、update文のwhere句でプライマリキーを使って内部結合させてます。

 SQLのイメージは下記となります。Row_Number() over(partition by ID order by Val)partition by IDに対応する赤線と、order by Valに対応する黄緑線と青線を引いてます。

SQLのイメージ
SQLのイメージ

MySQLのUpdate文でのLimit句指定を模倣

 上記のupdate文を応用して、『MySQLのUpdate文でのLimit句指定』を模倣することもできます。order by Valの順序で2行だけseqを999にupdateしてみます。

MySQLのUpdate文でのLimit句指定を模倣
update updateOLAP a
set seq = 999
from (select ID,Val,
      Row_Number() over(order by Val) as rn
        from updateOLAP) b
where a.ID=b.ID
  and a.Val=b.Val
  and b.rn <= 2;
更新結果
ID Val seq
1 100 999
1 300 2
1 700 3
2 200 999
2 400 2
2 800 3
3 500 1

 from句でwindow関数を使用したインラインビューを記述して、update文のwhere句でプライマリキーを使って内部結合させ、かつ、b.rn <= 2updateするレコード数を制限してます。

次のページ
3. Oracleのkeep指定を模倣

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
分析関数の衝撃連載記事一覧

もっと読む

この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4790 2010/02/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング