# 2018-10-20に公開、2018-10-21に更新しました。
このように書きましたが、やはりなかなかアウトプットできず(笑)
とりあえずできる範囲でアウトプットしていきます。
プログラマのためのSQL 読書会(28) - connpass
ちょっと前から
yuyabuさんが参加して、ブログエントリを書いてくれているので、まずはそちらを御参照ください。(そこへの訂正・補足もあるので)
プログラマのためのSQL 読書会(28)に参加(Yabu.log)
[Typo]
今回はなし。というか以下の(1)が実は翻訳ではなく、Typo ?
[翻訳の??な点]
(1) p.571 「高く」「高く」になっているが、正しくは「高く」「低く」
高く最も近い給与は5000ドル、この社員より高く最も近い給与は
↓
高く最も近い給与は5000ドル、この社員より低く最も近い給与は
原文はこう(less than)なので、単純に翻訳間違い。
Looking at the salaries, we see that the first salary greater than
his is $5000.00 and the flrst salary less than his is $1300.00.
(2) p.575
31.1 最頻値
「モード」の文字も欲しかったなぁ。(原文はThe Mode)
同様に「中央値」に対する「メジアン(Median)」や、分散と標準偏差(Variance and Standard Deviation)、平均偏差(Average Deviation)
なども、見出しではなく本文の初出のときに、元綴りがあるとさらに調べる時に便利だと思います。
(3) p.588
[訳注] でVARIANCEに言及しているが、Db2やMySQLは(標本)分散ではなく、母分散の動作なので注意が必要です。
また、
Oracleには元々あるVARIANCE以外にSQL標準のVAR_SAMPが追加されてますが、これは入力値が一つのときの戻り値に違いがあります。
[原著の??な点]
(4) p.573 「IBMはこの仕様の一部をDB2 UDB 6.2に実装した」
うーん6.2はさすがにしらないなぁ。
DB2技術全書「p.24 表1-1はDB2に関連する20年間の年表です。」にも以下の記述しかないし、
1999年 DB2 UDB for OS/390 V6.1 DB2 for Unix,Windows and OS/2 V6.1
以下のpdfにバージョンの名前があがるくらいで。
DB2 SQL Workshop for Experienced Users
http://ourworld.compuserve.com/homepages/Graeme_Birchall
DB2 UDB 6.2 SQL Cookbook
ただ↑このURLはすでになく、
Grame Birchallのこのシリーズのドキュメントをまとめてくれている人のサイトでも7.2以降でした。
本当に6.2 ? あるの?? IBMの方に聞いてみましたが、
このIBM DB2 バージョン6の検索でも見つからないので
公にはリリースされなかったのではないかと。。。。(7.xになったか??)
(5) 母分散にも言及が欲しい
31.4 分散と標準偏差(Variance and Standard Deviation)
(標本)分散(sample variance)のみに言及している。標準偏差を求めるための分散なので、意図的にはこれでいいが、
VARIANCE関数が(標本)分散を示す場合と、母分散を示す場合の実装があるので、
母分散(population variabnce)にも言及欲しい
分散(Wikipedia)
ここにも言及がある不偏分散(unbiased variance)とのそれぞれの関わりが分からないなぁ。(SQLの前に)
標準偏差とは?
[用語]
p.573
Cognos, I
nformixはすでに
IBMが買収している。
Brioは2003年にハイペリオンに買収され、
ハイペリオンはオラクルに買収されたが、
2015年4月にPremiere Support切れになっている。
MicroStrattegyは継続してBIツールを提供している
Enterprise Magagine : 英語版Wikipediaによると2007年ごろ停止したらしい。
[人物]
p.573
ハミッド・ピラヘシュ(Hamid pirahesh) 引き続きIBMで働いているようです。IBM Fellow, ACM Fellow。
こんなのもあった
アンディ・ウィコウスキ(Andy Witkowski) 引き続きOracleで働いているようです。
後述の「Introduction to OLAP functions」も参照のこと。
p.580
アナトニー・アブラモヴィッチ(Anatoly Abramovich)
イェリーナ・アレクサンドロヴァ(Yelena Alexandrova)
オイゲン・ビルガー(Eugene Birger)
Yelena以外は、以下の書籍の著者。MS SQL Server関連の人のようだ。
ptimizing Transact-SQL: Advanced Programming Techniques
Yelenaは同姓同名のスケーターもいるので、
うまく検索できないが、やはりMS SQL Server関連の人ではないか? まぁ検索してもセルコのこの本関連の検索結果しかでないが。。。
p.581
ケン・ヘンダーソン(Ken Henderson) MS SQL Serverの著作あり。以下の二冊は木村が所蔵。
The Guru’s Guide to Transact-SQL
The Guru’s Guide to SQL Server Architecture and Internals
「故」と書いてあるとおり、2008年に40そこそこでなくなっている。R.I.P. 私と同じ1967年生まれなのに。
マイケル・シーハン(Michael Sheehan) 同性同名の方が63才で亡くなっているが違う人のように見える。
リチャード・レムレー(Richard Romley) : 27.3 レムレーの除算(Romley's Division)にも登場。
ソロモンスミスバーニー(Salomon Smith Barney)勤務(だったらしい)。セルコが
ここのコメントでふれている。
セルコの著作、SQLパズルのPUZZLE 10 WAGES OF SINのAnser #2や、Thinging in Sets: の 18.3 Data Constraint Approachなどでも、名前が確認できる。
p.585
ペソ(Peso) 普通に検索すると通貨のペソしかヒットしない。以下のセルコ関連のコメントにペソ自身がコメント付けている。
アダム・マニチャク(Adam Machanic)
Machanicはマカニックでは??
こんな人らしい。
ボストンを拠点としたSQL Server関連開発、執筆、講演者。
[ドキュメント・書籍]
p.573
「Introduction to OLAP functions」
(6) C.J.Dateの参照書籍。Textbooks(Date, 1983, 1995a) yuyabuさんの見立てでは以下の記述がありましたが、
>Dateに関して1983年と1995年の著作は以下のものがあるらしい
>
> Relational Database Writings 1991-1994 [FACSIMILE], 1995, Addison Wesley Longman, ISBN 978-0201824599
> Database : a primer, Addison Wesley, 1983, ISBN 978-0201113587
>
>おそらくこの2冊からの引用ということだろう。
実はこの二冊は木村が持っているので内容確認したところ、厳密にそのような定義ではなく、以下の部分で使用・説明されている部分をさしているらしい。
Database : a primer : 18 Database Design (Continued) p.231 the suppliers-and-parts example.
Relational Database Writings 1991-1994 p.270 3. THE SUPPUERS-AND-PARTS DATABASEのp.271 Fig.1 The suppliers-and-parts database (data definition)
ただ、primerのほうは具体的なCREATE TABLEがないし、Database Writingsのほうは
DOMAINを使ってdata_typeを指定してなく、表名やカラム名が違うので、ググってもでてこないんですね。
同等の定義、データは、デイトが「
標準SQL(An introduction to the SQL Standard)」の初版(p.24)から使っている表だと思います。
オリジナルはこちら。MySQL用に最適化してますが、定義とデータはオリジナルのままです。
(「標準SQL」では、CREATE TABLEが掲載されていますし、DOMAINは使われていません)
CREATE DATABASE TED;
use TED;
drop table if exists S;
CREATE TABLE S
(SNO CHAR(5) NOT NULL,
SNAME CHAR(20),
STATUS DECIMAL(3),
CITY CHAR(15),
UNIQUE(SNO));
drop table if exists P;
CREATE TABLE P
(PNO CHAR(6) NOT NULL,
PNAME CHAR(20),
COLOR CHAR(6),
WEIGHT DECIMAL(3),
CITY CHAR(15),
UNIQUE(PNO));
drop table if exists SP;
CREATE TABLE SP (SNO CHAR(5) NOT NULL,
PNO CHAR(6) NOT NULL,
QTY DECIMAL(5),
UNIQUE(SNO,PNO));
insert into S values
('S1','Smith',20, 'London'),
('S2','Jones',10,'Paris'),
('S3','Blake',30,'Paris'),
('S4','Clark',20,'London'),
('S5','Adams',30,'Athens');
insert into P values
('P1','Nut','Red',12, 'London'),
('P2','Bolt','Green',17,'Paris'),
('P3','Screw','Blue',17,'Rome'),
('P4','Screw','Red',14,'London'),
('P5','Cam','Blue',12,'Paris'),
('P6','Cog','Red',19,'London');
insert into SP values
('S1','P1',300),
('S1','P2',200),
('S1','P3',400),
('S1','P4',200),
('S1','P5',100),
('S1','P6',100),
('S2','P1',300),
('S2','P2',400),
('S3','P2',200),
('S4','P2',200),
('S4','P4',300),
('S4','P5',400);
[所感]
メジアン(Median)の下りが長いが、実はSQL:2008で定められたPERCENTILE_CONTにて実現できるため、
「Firebird, MySQL, SQLite」以外では、「PERCENTILE_CONT( 0.5 ) WITHIN GROUP( ORDER BY expression )」で求められる。
つまり、
p.577-587のくだりは、歴史的な意味しかないです。。。。
p.578 [訳注1] 中央値は、OracleがMEDIANという関数名でサポートしている。とありますが、現状他のRDBMSでは以下。
なお、
Oracleも後述するPERCENTILE_CONTで求めることもできます。
Db2 対応している。(DB2 11.1以降)
説明には「PERCENTILE_CONT( 0.5 ) WITHIN GROUP( ORDER BY expression )と同値となっている」
MS SQL Server 直接本体では対応していない。(2017時点)
MDXでは対応している
MS SQL Server 2019でも未サポートのようです。(
新機能に見当たらない)
ただし、
IBMの別解と同様にPERCENTILE_CONTを使ってもとめることができる。(SQL Server 2012以降)
PostgreSQLも直接は対応していないが、
PERCENTILE_CONTで対応可能(
PostgreSQL 9.4以降)。
MySQLは8.0でも、median, percentile_cont共に未対応。
Medianの機能リクエストはある。
これを参照する形でPERCENTILE_CONTをリクエストしておくか。。。。
MariaDBは10.3.3で
median,
percentile_contに対応。
Firebird 3.0で未対応。
Medianのリクエストがでている。
これも。PERCENTILE_CONTのリクエストはでてないので、これもリクエストせねば。
SQLiteはHistory of src/include/nodes/relation.hの変更で、SQL:2008にもとづき実装されたふう。。。
2013-12-23 21:11
Support ordered-set (WITHIN GROUP) aggregates. This patch introduces generic support for ordered-set and hypothetical-set aggregate functions, as well as implementations of the instances defined in SQL:2008 (percentile_cont(), percentile_disc(), rank(), dense_rank(), percent_rank(), cume_dist()). We also added mode() though it is not in the spec, as well as versions of percentile_cont() and percentile_disc() that can compute multiple percentile values in one pass over the data.
https://www.sqlite.org/postgresql/finfo?name=src/include/nodes/relation.h&m=029349bc7e4721b3
しかし、ドキュメントにはみあたらん(
ここから参照できるcore, agg, windowみた)。relation.hを実際みてみるか。。。。
ここでMariaDB 10.3時点の他のRDBMSの対応状況を知ることができる。
なお、最後の例で:in_averageとなっているのは
Oracleのプレースホルダ。
MySQLだと@in_averageとコロンをアットマークにかえて、
ユーザ定義変数で代用できる。
[次回]
二週間後の2018-10-18(thr)にしようと思ったら、その日は
RISC-V Day in Tokyo 2018なんだよなぁ。お休みにするか、前後の日にずらすかもしれません
↓
結局金曜日にずらしました。間違えて木曜日にきた人スミマセン。。。。