给定一个表, t :
a b c d e
1 2 3 4 7
1 2 3 5 7
3 2 4 6 7
3 2 4 6 8
哪些SQL查询可以识别具有与列 a 和 b 中的每个元组关联的一个或多个不同值实例的列的列,?
在上面的表 t 中,列 d 和 e 符合此条件,但不符合 c 列。< / p>
对于元组&lt; 1,2&gt;和&lt; 3,2&gt;来自列 a 和 b 的列, c 列的每个元组没有不同的值。
列 d 具有用于元组&lt; 1,2&gt;的一个不同值的实例。 - 值4和5.
列 e 也有一个不同值的实例,用于元组&lt; 3,2&gt; - 值7和8。
答案 0 :(得分:2)
使用CASE
,COUNT
和GROUP BY
这样的内容应该对您有用:
select
a, b,
case when count(distinct c) > 1 then 'yes' else 'no' end colc,
case when count(distinct d) > 1 then 'yes' else 'no' end cold,
case when count(distinct e) > 1 then 'yes' else 'no' end cole
from t
group by a, b
答案 1 :(得分:0)
稍微间接地:
SELECT a, b,
COUNT(DISTINCT c) AS num_c,
COUNT(DISTINCT d) AS num_d,
COUNT(DISTINCT e) AS num_e
FROM t
GROUP BY a, b;
这会产生:
1 2 1 2 1
3 2 1 1 2
如果num_c
或num_d
或num_e
列的值大于1,则会有不同的值。您可以通过使用CASE语句来改变查询以列出列是否因(a,b)的给定值而变化:
-- v for varying, n for non-varying
SELECT a, b,
CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c,
CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d,
CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e
FROM t
GROUP BY a, b;
这会产生:
1 2 n v n
3 2 n n v
如果你真的只想知道给定列中的任何值是否因(a,b)的任何值而变化 - 而不是(a,b)的哪个值变化 - 你可以使用上面的查询作为FROM子句中的子查询,并根据需要组织事物。
SELECT MAX(num_c) AS num_c,
MAX(num_d) AS num_d,
MAX(num_e) AS num_e
FROM (SELECT a, b,
CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c,
CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d,
CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e
FROM t
GROUP BY a, b
);
这取决于v
大于n
;这个二元决策很容易(也很方便),但如果有4个状态要映射,则不一定方便或容易。
这会产生:
n v v