【发布时间】:2020-07-15 12:28:26
【问题描述】:
这是我手头的那种桌子:
SELECT * FROM smf_table LIMIT 20;
id | trip_id | segment_id | segment_start_timestamp | timestamp | lat | lon | travelmode
---------+---------+------------+-------------------------+------------+-------------+-------------+------------
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459467971 | 41.1523521 | -8.6097233 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468020 | 41.1523518 | -8.6097168 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468026 | 41.1524153 | -8.6097054 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468031 | 41.1524057 | -8.609701 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468036 | 41.1523647 | -8.6097146 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468041 | 41.1525607 | -8.6096725 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468046 | 41.1525077 | -8.6096843 | 0
5338113 | 533811 | 3 | 2016-04-01 00:47:16+01 | 1459468051 | 41.1524966 | -8.6096833 | 0
5338151 | 533815 | 1 | 2016-04-01 00:06:40+01 | 1459465282 | 41.14454009 | -8.56292593 | 3
5338151 | 533815 | 1 | 2016-04-01 00:06:40+01 | 1459465412 | 41.14454 | -8.5629259 | 3
5338151 | 533815 | 1 | 2016-04-01 00:06:40+01 | 1459465600 | 41.163172 | -8.5838214 | 3
这是一个包含超过 1 亿行的大表。我想使用来自smf_table 的过滤结果创建新表temp_table,以便在新表中:
- 不包括
travelmode列IS NULL的行(有很多) - 不包括
row2_timestamp - row1_timestamp = 0所在的行。
所以我想到了这样使用子查询:
CREATE TABLE temp_table
AS
WITH cte AS
(SELECT LEAD(timestamp) OVER (PARTITION BY id ORDER BY timestamp)
- LAG(timestamp) OVER (PARTITION BY id ORDER BY timestamp)
FROM smf_table
)
SELECT id,
lat,
lon,
timestamp,
travel mode
FROM smf_table
WHERE travelmode IS NOT NULL AND cte !=0;
ERROR: relation "smf_table" does not exist
LINE 13: FROM smf_table
【问题讨论】:
-
您可能会从此查询中得到错误,但并不是说
smf_table不存在。您确定在同一个数据库中运行这两个查询吗? -
您可能想从 CTE 中进行选择,为该列指定别名,然后也返回其他列。
cte ! = 0到底是什么意思?
标签: sql postgresql aggregate-functions sql-function