MW211 EXIT

devlog
PostgreSQL/続・NULLの処遇のおさらい
2013年02月02日
ついでに、グループごとの最大値もしくは最小値を含む明細を抽出する場合に
NULLを最劣後にするSQL文も記録にとどめておこう。

まずは最小値を含む明細を求める方法。
┌──────────────────────────────────────┐
│SELECT DISTINCT ON ("k") "k","c","s"                                        │
│    FROM (VALUES ('g',1,'a'),('g',2,'b'),('g',NULL,'c')) AS "t"("k","c","s")│
│    ORDER BY "k"         ASC,                                               │
│             "c" IS NULL ASC,                                               │
│             "c"         ASC;                                      →(g,1,a)│
└──────────────────────────────────────┘

次に最大値を含む明細を求める方法。
┌──────────────────────────────────────┐
│SELECT DISTINCT ON ("k") "k","c","s"                                        │
│    FROM (VALUES ('g',1,'a'),('g',2,'b'),('g',NULL,'c')) AS "t"("k","c","s")│
│    ORDER BY "k"         ASC,                                               │
│             "c" IS NULL ASC,                                               │
│             "c"         DESC;                                     →(g,2,b)│
└──────────────────────────────────────┘

つまり、最後のORDERだけ逆(ASC←→DESC)にすればよいだけ。
ちなみに、「"k" ASC」は疑似「GROUP BY」なので、「"k" DESC」でもOK。
ついでに「"c" IS NULL ASC」は「"c" IS NOT NULL ASC」か「"c" IS NULL DESC」に
すれば、NULLが先頭にくる。
分類:PostgreSQL