Postgresql 通过条件连接字符串
我想根据与Postgresql 通过条件连接字符串,postgresql,concatenation,window-functions,case-when,Postgresql,Concatenation,Window Functions,Case When,我想根据与用户id关联的其他行的条件为新列赋值 e、 g.当设备从桌面更改为移动设备时,将桌面>移动设备分配给该用户id的所有记录。 当有两个以上不同的变化时,如从平板电脑到桌面和从桌面到移动,然后是平板电脑>桌面>移动 以下是示例数据: +---------+-------+---------+ | user_id | step | device | +---------+-------+---------+ | 7bc6de | step1 | desktop | | 7bc6de
用户id
关联的其他行的条件为新列赋值
e、 g.当设备
从桌面更改为移动设备时,将桌面>移动设备分配给该用户id
的所有记录。
当有两个以上不同的变化时,如从平板电脑到桌面和从桌面到移动,然后是平板电脑>桌面>移动
以下是示例数据:
+---------+-------+---------+
| user_id | step | device |
+---------+-------+---------+
| 7bc6de | step1 | desktop |
| 7bc6de | step2 | desktop |
| 7bc6de | step3 | mobile |
| 7bc6de | step4 | mobile |
| 7bc6de | step5 | desktop |
| 0ee6df | step1 | tablet |
| 0ee6df | step2 | tablet |
| 0ee6df | step3 | desktop |
| 0ee6df | step4 | desktop |
| 0ee6df | step5 | mobile |
+---------+-------+---------+
期望输出:
+---------+-------+---------+---------------------------+
| user_id | step | device | device_concatenated |
+---------+-------+---------+---------------------------+
| 7bc6de | step1 | desktop | desktop > mobile |
| 7bc6de | step2 | desktop | desktop > mobile |
| 7bc6de | step3 | mobile | desktop > mobile |
| 7bc6de | step4 | mobile | desktop > mobile |
| 7bc6de | step5 | desktop | desktop > mobile |
| 0ee6df | step1 | tablet | tablet > desktop > mobile |
| 0ee6df | step2 | tablet | tablet > desktop > mobile |
| 0ee6df | step3 | desktop | tablet > desktop > mobile |
| 0ee6df | step4 | desktop | tablet > desktop > mobile |
| 0ee6df | step5 | mobile | tablet > desktop > mobile |
+---------+-------+---------+---------------------------+
其他场景:
+---------+-------+---------------------+---------+---------------------+
| user_id | step | created_at | device | device_concatenated |
+---------+-------+---------------------+---------+---------------------+
| user1 | step1 | 2021-03-16 14:03:16 | mobile | mobile > desktop |
| user1 | step2 | 2021-03-16 14:03:16 | mobile | mobile > desktop |
| user1 | step3 | 2021-03-16 14:03:55 | mobile | mobile > desktop |
| user1 | step4 | 2021-03-16 14:04:08 | desktop | mobile > desktop |
+---------+-------+---------------------+---------+---------------------+
在表中,有重复的步骤,即用户可以在不同的时间使用不同的设备看到相同的步骤。在这种情况下,我如何在预期结果中获得每个用户和设备的第一步,并进行如下更改
+---------+-------+---------------------+---------+
| user_id | step | created_at | device |
+---------+-------+---------------------+---------+
| user1 | step1 | 2021-03-16 14:03:16 | mobile |
| user1 | step2 | 2021-03-16 14:04:07 | mobile |
| user1 | step2 | 2021-03-16 14:03:47 | desktop |
| user1 | step3 | 2021-03-16 14:03:55 | mobile |
| user1 | step3 | 2021-03-16 14:04:00 | mobile |
| user1 | step1 | 2021-03-16 14:04:02 | desktop |
| user1 | step2 | 2021-03-16 14:03:16 | mobile |
| user1 | step3 | 2021-03-16 14:04:07 | mobile |
| user1 | step4 | 2021-03-16 14:04:08 | desktop |
| user1 | step4 | 2021-03-16 14:04:09 | tablet |
+---------+-------+---------------------+---------+
预期结果:
+---------+-------+---------------------+---------+---------------------+
| user_id | step | created_at | device | device_concatenated |
+---------+-------+---------------------+---------+---------------------+
| user1 | step1 | 2021-03-16 14:03:16 | mobile | mobile > desktop |
| user1 | step2 | 2021-03-16 14:03:16 | mobile | mobile > desktop |
| user1 | step3 | 2021-03-16 14:03:55 | mobile | mobile > desktop |
| user1 | step4 | 2021-03-16 14:04:08 | desktop | mobile > desktop |
+---------+-------+---------------------+---------+---------------------+
如果可以在多台设备上看到相同的用户和步骤,则需要添加一个附加的with子句,以便使用选择DISTINCT
,仅选择所需的一个(例如,最早的一个):
如果可以在多台设备上看到相同的用户和步骤,则需要添加一个附加的with子句,以便使用选择DISTINCT
,仅选择所需的一个(例如,最早的一个):
你可以使用
string\u agg
。我试过了,但是没有。不知道为什么…@AdamKG我意识到我的表中有重复的步骤,即用户可以在不同的时间用不同的设备看到相同的步骤。作为附加问题添加了这个,您介意看一下吗?您可以使用string\u agg
。我试过了,但是没有。不知道为什么…@AdamKG我意识到我的表中有重复的步骤,即用户可以在不同的时间用不同的设备看到相同的步骤。作为附加问题添加了这个,您介意看一下吗?
WITH input_data as (
select distinct on (user_id, step) user_id, step, created_at, device
from input_data_with_created_at
ORDER BY user_id, step, created_at
),
(...) -- Rest of the CTEs, same as before but with timestamp included.