简体   繁体   English

连接来自多列的不同值

[英]Concatenate distinct values from multiple columns

I have this in a table我在桌子上有这个

party1 | party2
A      | E 
B      | D
C      | H
D      | B
E      | A
F      | H 
G      | I

Result I am trying to get is distinct concatenation of party1 and party2 , ie我试图得到的结果是party1party2的不同串联,即

AE (will same as EA so only one instance is required)
BD (will same as DB so only one instance is required)
CH
FH
GI

Party1 and Party2 are formed using CTE. Party1 和 Party2 是使用 CTE 形成的。 Parties AI flows from single table Party and are identified as party1 and party2 using business logic of code 4 and 1.各方 AI 来自单表 Party,并使用代码 4 和 1 的业务逻辑标识为 party1 和 party2。

Below is the query i could form下面是我可以形成的查询

WITH CTE AS
(
      SELECT 
    DISTINCT CPR1.PARTY_IDENTIFIER AS PARTY1,
             CPR2.PARTY_IDENTIFIER AS PARTY2,
             CCR.CLIENT_RELATIONSHIP_TYPE_CODE,
             CPR1.CLIENT_TYPE_CODE
        FROM GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR1
        JOIN GOLD.CLIENT_TO_CLIENT_RELATIONSHIP CCR 
          ON     CPR1.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER 
             AND CCR.CLIENT_RELATIONSHIP_TYPE_CODE = '04'
             AND CPR1.CLIENT_TYPE_CODE = '1'
        JOIN GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR2 
          ON CPR2.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER
       WHERE (CPR1.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR1.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND (CPR2.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR2.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND CPR1.PARTY_IDENTIFIER<>CPR2.PARTY_IDENTIFIER
         AND CPR1.DATA_AS_OF_DATE LIKE '201912%' 
         AND CPR2.DATA_AS_OF_DATE LIKE '201912%'
         AND CCR.DATA_AS_OF_DATE LIKE '201912%'
)

  SELECT 
DISTINCT CONCAT("PG","_",TRIM(CAST(PARTY1 AS STRING)) ,"_",TRIM(CAST(PARTY1 AS STRING))) AS PG_KEY,
         party1,
         party2
    FROM CTE

Your description says that you are actually not interested in the concatenation but in the (2-element) sets that are composed from the paired data.您的描述说您实际上对串联不感兴趣,而是对由配对数据组成的(2 元素)集合感兴趣。 Representing them (as you do) as a 2-letter string, go along the following template.沿以下模板将它们(如您所做的那样)表示为 2 个字母的字符串 go。

WITH CTE AS
(
      SELECT CPR1.PARTY_IDENTIFIER AS PARTY1,
             CPR2.PARTY_IDENTIFIER AS PARTY2,
             CCR.CLIENT_RELATIONSHIP_TYPE_CODE,
             CPR1.CLIENT_TYPE_CODE
        FROM GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR1
        JOIN GOLD.CLIENT_TO_CLIENT_RELATIONSHIP CCR 
          ON     CPR1.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER 
             AND CCR.CLIENT_RELATIONSHIP_TYPE_CODE = '04'
             AND CPR1.CLIENT_TYPE_CODE = '1'
        JOIN GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR2 
          ON CPR2.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER
       WHERE (CPR1.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR1.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND (CPR2.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR2.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND CPR1.PARTY_IDENTIFIER<>CPR2.PARTY_IDENTIFIER
         AND CPR1.DATA_AS_OF_DATE LIKE '201912%' 
         AND CPR2.DATA_AS_OF_DATE LIKE '201912%'
         AND CCR.DATA_AS_OF_DATE LIKE '201912%'
)
  select
distinct CASE WHEN party1 < party2 
              THEN party1 || party2 
              ELSE party2 || party1
         END pair
         FROM CTE
       ;

Caveats注意事项

Pull the CTE definition out of the subquery.将 CTE 定义拉出子查询。 Concat syntax may vary depending on the sql dialect / database product you are using. Concat 语法可能因您使用的 sql 方言/数据库产品而异。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM