postgresql 基于跨列重复值的唯一SQL查询

pftdvrlh  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

我想构建一个SQL查询,如下所示:我有一个表,例如:
| 交易ID|消费者|制片人|局外人|交易日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|山姆|尼克|尼克|十二月一日|
| 第二章|杰克|鲍勃|史蒂夫|十二月一日|
| 三个|吉尔|吉尔|亚伦|十二月二日|
| 四个|迈克|南希|迈克|十二月三日|
| 五个|吉尔|弗雷德|杰生|十二月四日|
根据职责类型,我希望检查该人员是否在另一列中具有任何其它职责,并输出唯一的职责名称。人员可以在不同的事务处理日期具有不同的职责。同一事务处理ID/日期不应重复人员职责。输出示例:
| 人员姓名|唯一角色|交易日期|
| - ------|- ------|- ------|
| 山姆|消费者|十二月一日|
| 杰克|消费者|十二月一日|
| 吉尔|消费者-生产者|十二月二日|
| 迈克|消费者-局外人|十二月三日|
| 吉尔|消费者|十二月四日|
| 尼克|生产者-外部人员|十二月一日|
| 鲍勃|制片人|十二月一日|
| 南希|制片人|十二月三日|
| 弗雷德|制片人|十二月四日|
| 史蒂夫|局外人|十二月一日|
| 亚伦|局外人|十二月二日|
| 杰生|局外人|十二月四日|

nx7onnlm

nx7onnlm1#

你可以先将三个字段“Consumer"、“Producer”和“Outsider”展开为一个单独的字段,每个字段都有区别,然后使用STRING_AGG对每个日期和人物应用字符串聚合。

WITH cte AS (
    SELECT DISTINCT consumer AS PersonName, 
                    'Consumer' AS UniqueRole, 
                    TransactionDate
    FROM tab
    UNION ALL
    SELECT DISTINCT producer AS PersonName, 
                    'Producer' AS UniqueRole, 
                    TransactionDate
    FROM tab
    UNION ALL
    SELECT DISTINCT outsider AS PersonName, 
                    'Outsider' AS UniqueRole,
                    TransactionDate
    FROM tab
)
SELECT PersonName, 
       STRING_AGG(UniqueRole, '-') AS UniqueRole,
       TransactionDate 
FROM cte
GROUP BY PersonName, TransactionDate
ORDER BY UniqueRole

查看here演示。

相关问题