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



我正在尝试创建一个带有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;

基本上,对于每个IDAction_with_no_date将显示Action中的值与'**'字符串的串联,其中Date为空

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

如果一个ID采用相同的Action(即play(,并且如果一个动作具有date而另一个动作没有,则输出将具有一个用于IDplayplay**

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

ID Date  Action
1  1/2/22 read
1  1/3/22 play
1  NULL   play

以及CCD_ 15 的预期结果

ID Action_with_no_date
1  read, play**

我该如何处理?

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

演示:

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

相关内容

  • 没有找到相关文章

最新更新