计算列上的不同值

Fra*_*ckT 1 postgresql-9.5

我很难得到结果

这是我的数据集

一种 C cnt
2 1 2
1 5 5
2 1 4
1 1 1

预期结果

一种 C cnt
2 1 2 2
1 5 5 2
2 1 4 3
1 1 1 1

PG 9.5

Cha*_*ace 5

针对VALUES表的相关子查询应该可以解决问题:

SELECT
    t.A, t.B, t.C,
    (SELECT COUNT(DISTINCT v.n) FROM (VALUES(t.A),(t.B),(t.C)) AS v(n)) AS cnt
FROM table t
Run Code Online (Sandbox Code Playgroud)

如果您想对计数和求和等值进行单独计算,则可以使用横向连接(又名 APPLY) overVALUES代替:

SELECT A, B, C ,D, E, v.countDistinct, v.countNotNull, v.Total
FROM  test,
LATERAL (
    SELECT COUNT(DISTINCT v.n), COUNT(v.n), SUM(v.n)
    FROM (VALUES (A),(B),(C), (D), (E)) AS v(n)
) AS v(countDistinct, countNotNull, Total)
Run Code Online (Sandbox Code Playgroud)