我正在尝试创建一个带有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;
基本上,对于每个ID
,Action_with_no_date
将显示Action
中的值与'**'
字符串的串联,其中Date
为空
在我这样做之后,我发现了一个边缘案例。
如果一个ID
采用相同的Action
(即play
(,并且如果一个动作具有date
而另一个动作没有,则输出将具有一个用于ID
的play
和play**
但是,我希望它只显示一个带有**的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