キムラデービーブログ

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

    MySQLでは8.0からウインドウ関数に対応しました。これにより商用RDBMS御三家+PostgreSQLが対応していた
    多くの分析関数・ウインドウ関数が利用できるようになりました。

    分析関数については、山岸さんが以下の時系列の流れで詳細に解説してくださってます。

    1.分析関数の衝撃(1-6) 商用RDBMSでの説明。主にOracle 10.2を利用。
    2.MySQLで分析関数を模倣(1-5) 分析関数未実装のRDBMSでの説明。主にMySQL 5.1を利用。
    3.PostgreSQLの分析関数の衝撃(1-8) PostgreSQL8.4での説明

    これらの記事で、分析関数を利用していないクエリについては、主にミックさんがオンラインで掲載した
    達人に学ぶSQL
    を参照しています。

    これは以下の本にまとまってます。

    達人に学ぶSQL徹底指南書 第2版

    このような経緯のため、MySQL 8.0を利用する人は「PostgreSQLの分析関数の衝撃」を参照し、
    ウインドウ関数でわからないところがあれば「分析関数の衝撃」を参照、
    ウインドウ関数と等価のクエリでわからないところがあれば「MySQLで分析関数を模倣」
    これらが参照しているクエリでわからないところがあればミックさんのオンライン記事か、書籍を参照すると
    きっともれなくわかると思います。

    今回は「PostgreSQLの分析関数の衝撃1」を参照してみます。

    [勝手に対応]MySQL8.0の分析関数の1(モードとメジアン)

    以下の記事のMySQL8.0対応版です。

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


    この連載は無償のユーザ登録して、CodeZineダウンロード規約に同意すれば、
    ソースコードがダウンロードできますので実際にためしてみたい方は上記ページからダウンロードしてください。

    1. 歯抜けを探す


     これはDDL, DMLともにそのまま動作します。これはMySQL 8.0ではROW_NUMBERがサポートされたからです。

    ROW_NUMBER(MySQL 8.0 Manual)

    ソースコードを利用する人で注意点は(本質ではないのですが)一部コメントを示す--の後に空白がないため
    エラーになります。MySQLの方言でコメントの--の後には空白(ホワイトスペース)が必要です。

    2. 最頻値(モード)を求める

    MySQLにはtext型のデータ型がないので、Graduatesテーブルのnameカラムのデータ型をtextからvarchar(10)などに変換すると動作します。
    window関数を使わない版のクエリはすべてのMySQLで、window関数を使う版のクエリはMySQL 8.0以降で利用できます。

    最頻値(モード)を利用する際の注意点は、一般的に利用されるmode()関数とは戻り値が違う場合があることです。
    モード(最頻値)が複数ある場合でも、当該ページにあるクエリやプログラマのためのSQL「31.SQLにおける記述統計」にある方法で求めると複数のモード(最頻値)が結果として戻りますが、mode()関数 (OracleやPostgreSQL, MariaDBで実装)では、複数のモードがある場合は一番小さいもの一つが戻ります。これを模倣するためには、incomeでorder byして、一行取り出せばいいことになります。

    select income,cnt
    from (select income,count(*) as cnt,
    max(count(*)) over() as maxCnt
    from Graduates
    group by income
    order by income) a
    where cnt = maxCnt
    limit 1;

    ORDER BYが必要になるのは、MySQL 8.0ではGROUP BYの暗黙のソートがされなくなるためです。(ハッシュによるGROUP BYへの布石?)

    MySQL 8.0では「GROUP BYによる暗黙のソート」がされなくなるよ

    3. 中央値(メジアン)を求める

    これは、どちらも動作します。MySQL(そしてFirebirdも)以外のプラットフォームでは、SQL標準のPERCENTILE_CONT(0.5)を使ったり方言のmedian()関数を利用して求めることもできます。

     MySQLは8.0時点でmedian()もpercentile_cont()も実装されていません。以下のようにFR(Feature Request)を出しました。

    Bug #93234 Support percentile_cont (SQL Standard) for median.

     上記から参照しているBugで過去にmedianサポートのFRも出ています。

    明日は(というよりもう今日ですね)@hmatsu47です。

    JUGEMテーマ:コンピュータ



    | meijik | MySQL | 23:02 | comments(0) | trackbacks(0) | - | - |









    http://blog.kimuradb.com/trackback/877547
          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