如何连接条件字段并删除相同的值

How to concatenate a conditional field and remove the same value

我正在尝试创建一个带有 case 语句的列,然后连接该列。这是一个示例代码。

WITH base AS (
SELECT ID, Date, Action, case when (Date is null then Action || '**' else Action End) Action_with_no_date
FROM <Table_Name>
)
SELECT ID, "array_join"("array_agg"(DISTINCT Action_with_no_date), ', ') Action_with_no_date
FROM base
GROUP BY ID;

基本上,Action_with_no_date 将显示 Action 中值的串联,'**' 字符串添加到每个值 Date 为空的值 ID

在我这样做之后,我发现了一个边缘案例。

如果一个 ID 有相同的 Action(即 play),并且如果一个动作有 date 而另一个没有,那么输出将有一个 play 和一个 play** 作为 ID

但是,我希望它只显示一个带有 ** 的 play。 以下是 ID = 1

的示例数据
ID Date  Action
1  1/2/22 read
1  1/3/22 play
1  NULL   play

ID

的预期结果
ID Action_with_no_date
1  read, play**

我该如何处理?

如果使用带有 case 表达式的分析 max() 来计算 ** 后缀,如果有任何行的每个 id 和 action 为 null。然后将后缀与动作连接起来。

演示:

with mytable as (
SELECT * FROM (
    VALUES
        (1, '1/2/22', 'read'),
        (1, '1/3/22', 'play'),
        (1, NULL, 'play')
) AS t (id, date, action)
)

select id, array_join(array_agg(DISTINCT action||suffix), ', ')
from
(
select id, date, action,
       max(case when date is null then '**' else '' end) over(partition by id, action) as suffix
  from mytable
)s
group by id

结果:

1   play**, read