キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< 最近のSQLite, 最新のSQLite 3.26.0 | main | [勝手に対応]MySQL8.0の分析関数の1(モードとメジアン) >>
[勝手に更新] PostgreSQLの分析関数の衝撃2018(前編)
0
    [勝手に更新] PostgreSQLの分析関数の衝撃2018(前編)

    本エントリはPostgreSQL Advent Calendarの二日目のエントリです。
    (昨日のエントリはながやすさんでした。こちらをご参照ください)

    PostgreSQLはオープンソースRDBMSの中ではWindow関数の実装がはやく、
    2009年7月に正式リリースされたPostgreSQL 8.4で初期実装されました。
    もう、9年半も前なんですよね。

    その直後にOracle界隈では有名人の山岸さんが以下の一連の記事を公開したので、
    これでWindow関数を知った、勉強した、使ってみた、という方は多かったのではないでしょうか。

    PostgreSQLの最新版は皆さんご存知のPostgreSQL 11 !ということで、
    今一度記事を見直して、最新版に勝手に更新しようというのが、本エントリの趣旨でございます。
    以下のエントリがありますが、とりあえず1.2.のみ前編として公開でお願いしますm(_ _)m

    1.PostgreSQLの分析関数の衝撃1 (モードとメジアン)
    2.PostgreSQLの分析関数の衝撃2 (Lag関数と累計と移動累計)
    3.PostgreSQLの分析関数の衝撃3 (数列を扱うSQLとrange指定)
    4.PostgreSQLの分析関数の衝撃4 (集合の一致と全称肯定命題)
    5.PostgreSQLの分析関数の衝撃5 (Row_Number関数の応用例)
    6.PostgreSQLの分析関数の衝撃6 (window関数の応用例)
    7.PostgreSQLの分析関数の衝撃(7) ――window関数の変わった使用例
    8.PostgreSQLの分析関数の衝撃(8) ――RowsとRangeの代用

    1.PostgreSQLの分析関数の衝撃1 (モードとメジアン)

    PostgreSQL 9.4からそれぞれ専用の関数が用意されたので、それを使うと簡単にもとまります。

    mode()

    postgres=# SELECT mode() WITHIN GROUP (ORDER BY income) FROM Graduates;
    mode
    -------
    10000
    (1 行)

    median()....は無いので、percentile_cont()を使います。

    postgres=# SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY income) FROM Graduates;
    percentile_cont
    -----------------
    17500
    (1 行)

    注意すべきはモード(最頻値)が複数ある場合です。
    山岸さんの例はちょうど最頻値が二つあるため、記載してある方法や、プログラマのためのSQL「31.SQLにおける記述統計」にある方法でやると、以下の値が戻ります。

    income
    --------
    10000
    20000
    (2 行)

    PostgreSQL 9.4で実装されたmode()や、PostgreSQL wikiで紹介されている方法ではモード(最頻値)が
    ひとつしかない場合しか、正しい値は出力されず、複数ある場合は一番小さな値(incomeでORDER BYしているため)
    戻りません。ご注意ください。

    2.PostgreSQLの分析関数の衝撃2 (Lag関数と累計と移動累計)


    「PostgreSQL8.4では文法エラー」と紹介された以下のクエリですが、PostgreSQL 11でも同様にエラーがでます。

    postgres=# select name,address
    postgres-# from (select name,address,
    postgres(# count(distinct address) over(partition by address)
    postgres(# as distinctAddressCount
    postgres(# from Addresses) a
    postgres-# where distinctAddressCount > 1;
    ERROR: DISTINCT is not implemented for window functions
    行 3: count(distinct address) over(partition by address)

    「PostgreSQL8.4では文法エラー」と紹介された、もうひとつのクエリはPostgreSQL 11では正しく動作します。

    postgres=# select prc_date,prc_amt,
    postgres-# case when count(*) over(order by prc_date) >= 3
    postgres-# then sum(prc_amt) over(order by prc_date rows 2 Preceding)
    postgres-# end as mvg_sum
    postgres-# from Accounts;
    prc_date | prc_amt | mvg_sum
    ------------+---------+---------
    2006-10-26 | 12000 |
    2006-10-28 | 2500 |
    2006-10-31 | -15000 | -500
    2006-11-03 | 34000 | 21500
    2006-11-04 | -5000 | 14000
    2006-11-06 | 7200 | 36200
    2006-11-11 | 11000 | 13200
    (7 行)

    地味に毎年改善されるのがPostgreSQLのよいところです。
    3.以降はまた、時間がとれたときに続きをします。

    明日はPostgreSQL界のおとこまえ、きだくんです。

    JUGEMテーマ:コンピュータ



    | meijik | PostgreSQL | 00:02 | comments(0) | trackbacks(0) | - | - |









    http://blog.kimuradb.com/trackback/877543
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
    << December 2018 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    • Windows上でのMySQLビルド方法
      kinoyasu (03/31)
    • 気軽に新しいMySQLを試してみる: MySQL Sandboxのススメ
      MeijiK (09/19)
    • 伝わらない曲シリーズ: 川島恵「ミスター不思議」
      96 (07/05)
    • 気軽に新しいMySQLを試してみる: MySQL Sandboxのススメ
      MeijiK (02/17)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE