トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

9-48 集合で考える

SQLパズル

集合関数の組み合わせと、
同値な条件のまとめです。

なお、
P⇔Q
が成立するなら
P⇒Q
Q⇒P
が成立するので
対偶である
_  _
Q⇒P
_  _
P⇒Q
も成立する

よって
_  _
P⇔Q
も成立する
といった理論を何回か使ってます

一方が真ならば他方は必ず真であり、かつ、一方が偽ならば他方も必ず偽であるとき、
この二つの命題は同値であるという。
同値の定義からも明らかです


こちらを参考にさせていただきました 集合で考える ―― HAVING句の力:その2 Thinking in Aggregates(英語)
同値な条件1 count(distinct Val) = count(Val) ⇔ 重複したValが存在する count(Val)を、鳩の数、 count(distinct Val)を、鳩の巣の数、 とおいての鳩の巣原理です 2-3-22 鳩の巣原理で重複を調べる 同値な条件1より count(distinct Val) < count(Val) ⇔ 重複したValが存在しない
同値な条件2 count(*) = count(Val) ⇔ ValにNULLが存在しない 同値な条件2より count(*) > count(Val) ⇔ ValにNULLが存在する 同値な条件2のアレンジ Valに、3と4しか存在しない ⇔ count(*) = sum(case when Val in(3,4) then 1 else 0 end) Valが、全て3以上 ⇔ count(*) = count(case when Val >= 3 then 1 else 0 end) 9-23 nullのないグループを出力
同値な条件3 min(Val - 定数) = -max(Val - 定数) ⇔ Valの最大値と最小値が指定した定数から同じ距離にある min(Val - 定数) = -max(Val - 定数) ⇔ min(Val) - 定数 = -(max(Val) - 定数) ⇔ min(Val) - 定数 = -max(Val) + 定数 ⇔ 2*定数 = min(Val) + max(Val) ⇔ 定数 = (min(Val) + max(Val)) /2 中学数学の図形や、高校数学のベクトルの、中点の公式で考えて、 Valの最大値と最小値が指定した定数から同じ距離にある ⇔ 定数が、min(Val)とmax(Val)の中点である と考えると分かりやすいと思います SQLでは、 min(Val) + max(Val) = 2*定数 で指定するとオプティマイザにもプログラマにもやさしいかもしれませんね 内分点や外分点も条件指定可能ですが、おそらく使い道はないでしょう 中点 - Wikipedia 中点と平均 〜さんすう・数学のお勉強〜 内分点・外分点1 内分点・外分点2
同値な条件4 min(Val) = -max(Val) ⇔ Valの最大値と最小値が、異符号で等しいか、互いに0
同値な条件5 min(Val) * max(Val) < 0 ⇔ 最大値の符号が正で最小値の符号が負
同値な条件6 min(Val) * max(Val) = 0 ⇔ 最大値と最小値の、少なくとも1つが0
同値な条件7 min(Val) * max(Val) > 0 ⇔ Valの符号は全て正、または全て負
同値な条件8 sign(min(Val)) = sign(max(Val)) ⇔ Valの符号は全て正、または全て負、または全て0である
同値な条件9 min(abs(Val)) = 0 ⇔ Valの少なくとも1つが0
同値な条件10 abs(min(Val)) = min(Val) ⇔ 全てのValが0以上 ⇔ Valに負数が存在しない
同値な条件11 min(Val) = max(Val) ⇔ Valは1つだけの値を持つか、またはNULLである
同値な条件12 集合に、3しか存在しない ⇔ 3=all(max(Val),min(Val)) ⇔ count(*) = sum(decode(Val,3,1,0)) 同値な条件12より 集合に、3以外が存在する ⇔ not(3=all(max(Val),min(Val))) ⇔ count(*) > sum(decode(Val,3,1,0))
同値な条件13 max(case when 条件A then 1 else 0 end) = 1 ⇔ 集合に、条件Aを満たす要素が存在する max(case when 条件A then 1 else 0 end)は、 集合に、条件Aを満たす要素が存在すれば1、 集合に、条件Aを満たす要素が存在しなければ0 となります 9-18 存在有無のブール値を求める
同値な条件14 min(case when 条件A then 0 else 1 end) = 1 ⇔ 集合に、条件Aを満たす要素が存在しない min(case when 条件A then 0 else 1 end)は、 集合に、条件Aを満たす要素が存在しなければ1、 集合に、条件Aを満たす要素が存在すれば0 となります 9-18 存在有無のブール値を求める
同値な条件15 同値な条件13と、同値な条件14を組み合わせた論理演算(論理和、論理積など) 9-22 存在有無のブール値で論理演算 9-42 存在有無のブール値の応用
同値な条件16 max(case when 条件A then 1 else 0 end) = 1 ⇔ 集合に、条件Aを満たす要素が少なくとも1つ存在する max(case when 条件A then 0 else 1 end) = 1 ⇔ 集合に、条件Aを満たさない要素が少なくとも1つ存在する min(case when 条件A then 1 else 0 end) = 1 ⇔ 集合に、条件Aを満たさない要素が1つもない ⇔ 集合の要素は、全て条件Aを満たす min(case when 条件A then 0 else 1 end) = 1 ⇔ 集合に、条件Aを満たす要素が1つもない ⇔ 集合の要素は、全て条件Aを満たさない 論理と証明 数学の論理

解説

集合関数の組み合わせは、もちろん、having句で使えまし、 select句での、検索case式の条件で使うこともできます 分析関数での集合の分割(partition by)でも、 似たような考え方が使えます