Sql 为每组列标识具有不同值的列
给定一个表,t: 什么样的SQL查询可以识别具有一个或多个不同值实例的列,这些实例与列a和b中的每个元组关联 在上面的表t中,d列和e列将满足该标准,但c列不满足 对于元组和来自列a和b的元组,列c并没有针对每个元组的不同值 列d有一个元组值变化的实例——值4和5Sql 为每组列标识具有不同值的列,sql,distinct-values,Sql,Distinct Values,给定一个表,t: 什么样的SQL查询可以识别具有一个或多个不同值实例的列,这些实例与列a和b中的每个元组关联 在上面的表t中,d列和e列将满足该标准,但c列不满足 对于元组和来自列a和b的元组,列c并没有针对每个元组的不同值 列d有一个元组值变化的实例——值4和5 列e还有一个不同元组值的实例——值7和8。类似的内容应该适用于使用大小写、计数和分组方式: select a, b, case when count(distinct c) > 1 then 'yes' else 'n
列e还有一个不同元组值的实例——值7和8。类似的内容应该适用于使用
大小写
、计数
和分组方式
:
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
稍微间接地:
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
1 2 n v n
3 2 n n v
n v v
如果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 1 2 1
3 2 1 1 2
1 2 n v n
3 2 n n v
n v 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个状态需要映射,就不一定方便或容易
这将产生:
1 2 1 2 1
3 2 1 1 2
1 2 n v n
3 2 n n v
n v v
您正在使用哪些RDBMS?非常感谢!最后一个问题是我需要的。