如何连接条件字段并删除相同的值
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
我正在尝试创建一个带有 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