通过多次运行子查询创建PostgreSQL视图
我目前有一个sql语句,它可以聚合一些数据以获得多行输出,而不是对具有相同id的表的子集进行简单的最大/最小计算。下面的snipped根据位置更改计算特定id的行程通过多次运行子查询创建PostgreSQL视图,sql,postgresql,views,Sql,Postgresql,Views,我目前有一个sql语句,它可以聚合一些数据以获得多行输出,而不是对具有相同id的表的子集进行简单的最大/最小计算。下面的snipped根据位置更改计算特定id的行程 WITH id_locations AS ( SELECT created_at, id, location FROM locations WHERE id = 1 ), travel_locations AS ( SELECT created_at, id, location, RO
WITH id_locations AS (
SELECT created_at, id, location
FROM locations
WHERE id = 1
), travel_locations AS (
SELECT created_at, id, location, ROW_NUMBER() OVER(ORDER BY created_at) AS row_num
FROM id_locations
WHERE
created_at IN (
SELECT min(created_at)
FROM id_locations
GROUP BY location
) OR created_at IN (
SELECT max(created_at)
FROM id_locations
GROUP BY location
)
)
SELECT a.id id, a.created_at departed_at, b.created_at arrived_at, a.location departure_location, b.location arrival_location
FROM travel_locations AS a
INNER JOIN travel_locations AS b
ON a.row_num = b.row_num - 1
WHERE a.location <> b.location;
Data
id created_at location
1 1 1
1 2 1
1 3 2
1 4 2
1 5 5
1 6 5
1 7 5
1 8 5
2 1 1
2 2 1
2 3 1
2 4 1
2 5 3
2 6 3
2 7 3
2 8 3
Desired Output
id departed_at arrived_at departure_location arrival_location
1 2 3 1 2
1 4 5 2 5
2 4 5 1 3
我想创建一个视图,其中包含此sql语句的输出,该语句在按id分组的表的每个子集上运行
有没有办法用原始sql实现这一点,或者我需要用一些sql客户机迭代所有可能的id,运行相同的查询,并将结果插入表中以供将来参考
我正在使用postgresql 9.6作为参考
SELECT id,
max_created_at AS departed_at,
next_created_at AS arrived_at,
location AS departure_location,
next_location AS arrival_location
FROM
(SELECT id,
created_at,
location,
max(created_at) over(partition by id,location) AS max_created_at,
lead(created_at) over(partition by id order by location,created_at) AS next_created_at,
lead(location) over(partition by id order by location,created_at) AS next_location
FROM locations) t
WHERE max_created_at=created_at AND next_created_at IS NOT NULL
您试图获取的是id的最大创建位置和相应位置,以及下一个创建位置
使用“最大窗口”函数获取每个id、位置的最大创建位置。
使用lead获取位置,从按位置排序的下一行中创建值,为每个id创建值。
获取max_created_at等于当前行的created_at且next_created_at不为空的行。
您试图获取的是id的最大创建位置和相应位置,以及下一个创建位置
使用“最大窗口”函数获取每个id、位置的最大创建位置。
使用lead获取位置,从按位置排序的下一行中创建值,为每个id创建值。
获取max_created_at等于当前行的created_at且next_created_at不为空的行。
你的ID是唯一的吗?我想你是在寻找群组。发布一些示例数据和预期结果。不,对于示例来说,这可能不是最好的列名。。id_group语句很可能是多行的,我运行的语句要求我查看一个子集,其中只包含一个idEdited,以包含实际代码@vkp的示例,如果您从CTE中取出WHERE子句并将PARTITION BY id添加到窗口函数中,这会产生你想要的吗?你的ID是唯一的吗?我想你是在寻找群组。发布一些示例数据和预期结果。不,对于示例来说,这可能不是最好的列名。。id_group语句很可能是多行的,我运行的语句要求我查看一个具有唯一idEdited的子集,以包含实际代码@vkPE的示例。如果您从CTE中取出WHERE子句并将PARTITION BY id添加到窗口函数中,这会产生您想要的结果吗?