假设我有三列:dim1,dim2,dim3-所有int类型值。
我想计算行中不同值的数量-因此,对于ID#13的行,dim1 = 20,dim2 = 30和dim3 = 20,该值存储在新创建的列将等于2。
这有可能吗?我在COUNT DISTINCT的多个列上尝试了多种组合,但到目前为止还没奏效。
答案 0 :(得分:2)
诸如count
之类的聚合函数跨行而不是列工作。我看到两种方法可以解决此问题:
1)您可以使用case语句来解决此问题(此解决方案在包含3个以上字段时变得非常复杂):
select dim1, dim2, dim3,
case when dim1 <> dim2 then 1 else 0 end
+ case when dim1 <> dim3 then 1 else 0 end
+ case when dim2 <> dim3 then 1 else 0 end as cnt
from your_table
2)假设每一行都有某种ID,则可以使用union
将数据转换成更多的键/值集,这将允许您使用count
:< / p>
select dim1, dim2, dim3, cnt
from your_table
join (select id, count(distinct dim) as cnt from
(select id, dim1 as dim from your_table
union all
select id, dim2 from your_table
union all
select id, dim3 from your_table)
group by id) c
on your_table.id = c.id
答案 1 :(得分:0)
也许是这样(但是我没有尝试)
SELECT row_id,
CASE WHEN dim1=dim2 THEN CASE WHEN dim1=dim3 THEN 3 ELSE 2 END
WHEN dim1=dim3 OR dim2=dim3 THEN 2
ELSE 1
END AS nr_equal
FROM ....