postgresql 仅选择具有不同单元格的行

ff29svar  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(127)

我有以下表格(简化):

CUSTOMER_ID NAME     PHONE      AGE    HEIGHT     
        1    MANOLO   987456321  56     1.80         
        1    MANOLO   NULL       56     1.79         
        2    LUCÍA    NULL       56     1.50         
        2    LUCÍA    987456321  56     1.50

我期望的结果是只选择值彼此不同的单元格,即我期望的结果是:

ID_CLIENT NAME    PHONE      AGE     HEIGHT     
1         -       987456321  -       1.80         
1         -       NULL       -       1.79         
2         -       NULL       -       -        
2         -       987456321  -       -

我尝试过对表本身使用join,但结果保持嵌套,而不是在不同的行中。我有一种感觉,必须使用某种join或交集,因为最接近我所要求的结果是通过使用UNION实现的:

SELECT '-' AS NAME , PHONE , 0,
  FROM [test_temp].[dbo].[CUSTOMER3].       
  UNION     
   SELECT '-' AS NAME , 0 AS PHONE, HEIGHT, 0, FROM [TEST_TEMP].
  FROM [test_temp].[dbo].[CUSTOMER3] UNION select '-' as name , 0 as phone, height

但结果往往不完整或重复:

TELEPHONE NAME (No column name)
- NULL 0.00
- 0 1.45
- 0 1.50
- 0 1.56
- 0 1.70
- 0 1.74
- 0 1.80
- 0 1.90
- 0 1.96
- 987456321 0.00

欢迎光临

azpvetkf

azpvetkf1#

如果我理解正确的话,你需要这样的东西:

Select
    s1.CUSTOMER_ID as ID_CLIENT,
    case
        when exists (
            Select
                1
            from
                simplified s2
            where
                s2.name = s1.name
                and s2.CUSTOMER_ID <> s1.CUSTOMER_ID
        ) then '-'
        else s1.name
    end as name,
    --more of cases for columns you need
from
    simplified s1

在这里,name列被检查是否重复,如果找到,则替换为-。对于每个具有此重复规则的列,您需要重复这种情况(将name更改为相应的列)。

mpgws1up

mpgws1up2#

假设总是正好有2行具有相同的ID,列可以是null

SELECT a.customer_id
     , CASE WHEN a.name  IS DISTINCT FROM b.name  THEN a.name::text  ELSE '-' END AS name
     , CASE WHEN a.phone IS DISTINCT FROM b.phone THEN a.phone::text ELSE '-' END AS phone
      -- etc.
FROM   customer3 a
JOIN   customer3 b USING (customer_id)
WHERE  a.ctid <> b.ctid;

值得注意的是,我们需要转换为text(或类似的),以允许其他数据类型的结果中有'-'。
IS DISTINCT FROM也包含null值。
ctid是Postgres中主键的一个可怜的替代品。请参阅:

  • 在PostgreSQL中查找所有列重复且没有唯一字段的行

相关问题