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.