根据列 id(顺序)将所选数据合并到同一行
Combine selected data into same row based on column id (order)
我有一个 table 组合,用于描述位置人流。主要 'travel_flows' table 的结构如下面第一个 table 所示。 'order_id' 列描述了流的顺序。
+-----------+------------+---------+-------------+----------+
| travel_id | purpose_id | name_id | location_id | order_id |
+-----------+------------+---------+-------------+----------+
| 434 | 23 | 55 | 85 | 1 |
| 212 | 43 | 55 | 45 | 2 |
| 411 | 41 | 55 | 17 | 3 |
| 148 | 23 | 32 | 32 | 1 |
| 153 | 11 | 32 | 19 | 2 |
+-----------+------------+---------+-------------+----------+
我试图使用 PostgreSQL 9.6 实现的是根据 'location_id' 和 [=19] 以二进制原点(从)/目标(到)格式按 'name_id' 对返回的行进行分组=]值,类似下面的table:
+-----------------+--------------+------------------+---------------+------------+----------------+
| from_purpose_id | from_name_id | from_location_id | to_purpose_id | to_name_id | to_location_id |
+-----------------+--------------+------------------+---------------+------------+----------------+
| 23 | 55 | 85 | 43 | 55 | 45 |
| 43 | 55 | 45 | 41 | 55 | 17 |
| 23 | 32 | 32 | 11 | 32 | 19 |
+-----------------+--------------+------------------+---------------+------------+----------------+
有什么方法可以通过 select 语句来实现吗?
您可以使用 lead
window 函数执行此操作。
select * from (
select purpose_id,name_id,location_id,
lead(purpose_id) over(partition by name_id order by order_id) as to_purpose_id,
lead(name_id) over(partition by name_id order by order_id) as to_name_id,
lead(location_id) over(partition by name_id order by order_id) as to_location_id
from tbl
) t
where to_purpose_id is not null and to_name_id is not null and to_location_id is not null
您可以使用 Window 函数轻松实现此目的(参见 https://www.postgresql.org/docs/current/static/tutorial-window.html),具体来说,函数 lead()
:
with flow as (
select
name_id,
purpose_id as from_purpose_id,
lead(purpose_id) over w1 as next_purpose_id,
location_id as from_location_id,
lead(location_id) over w1 as next_location_id,
order_id
from travel_flows
window w1 as (partition by name_id order by order_id)
)
select
name_id, from_purpose_id, next_purpose_id, from_location_id, next_location_id
from flow
where next_purpose_id is not null
order by name_id, order_id
;
我有一个 table 组合,用于描述位置人流。主要 'travel_flows' table 的结构如下面第一个 table 所示。 'order_id' 列描述了流的顺序。
+-----------+------------+---------+-------------+----------+ | travel_id | purpose_id | name_id | location_id | order_id | +-----------+------------+---------+-------------+----------+ | 434 | 23 | 55 | 85 | 1 | | 212 | 43 | 55 | 45 | 2 | | 411 | 41 | 55 | 17 | 3 | | 148 | 23 | 32 | 32 | 1 | | 153 | 11 | 32 | 19 | 2 | +-----------+------------+---------+-------------+----------+
我试图使用 PostgreSQL 9.6 实现的是根据 'location_id' 和 [=19] 以二进制原点(从)/目标(到)格式按 'name_id' 对返回的行进行分组=]值,类似下面的table:
+-----------------+--------------+------------------+---------------+------------+----------------+ | from_purpose_id | from_name_id | from_location_id | to_purpose_id | to_name_id | to_location_id | +-----------------+--------------+------------------+---------------+------------+----------------+ | 23 | 55 | 85 | 43 | 55 | 45 | | 43 | 55 | 45 | 41 | 55 | 17 | | 23 | 32 | 32 | 11 | 32 | 19 | +-----------------+--------------+------------------+---------------+------------+----------------+
有什么方法可以通过 select 语句来实现吗?
您可以使用 lead
window 函数执行此操作。
select * from (
select purpose_id,name_id,location_id,
lead(purpose_id) over(partition by name_id order by order_id) as to_purpose_id,
lead(name_id) over(partition by name_id order by order_id) as to_name_id,
lead(location_id) over(partition by name_id order by order_id) as to_location_id
from tbl
) t
where to_purpose_id is not null and to_name_id is not null and to_location_id is not null
您可以使用 Window 函数轻松实现此目的(参见 https://www.postgresql.org/docs/current/static/tutorial-window.html),具体来说,函数 lead()
:
with flow as (
select
name_id,
purpose_id as from_purpose_id,
lead(purpose_id) over w1 as next_purpose_id,
location_id as from_location_id,
lead(location_id) over w1 as next_location_id,
order_id
from travel_flows
window w1 as (partition by name_id order by order_id)
)
select
name_id, from_purpose_id, next_purpose_id, from_location_id, next_location_id
from flow
where next_purpose_id is not null
order by name_id, order_id
;