我基本上有一张桌子,有date
, timestamp
, DID
, coordinates
。
我想要一个查询,它将返回带有第 X 天的最后一个坐标、第 X+1 天的第一个坐标和坐标的行。所以它只会返回有 2 个连续日期的结果。
这就是我想出的。一直试图让这个查询工作,它几乎是完美的,但我只需要添加注释掉的where
条件,它就会完全符合我的要求。但是当我取消注释时,我收到一个错误“列不存在”:
SELECT a.timestamp_intersecting_date d1,b.timestamp_intersecting_date d2,
a."DID",
a.timestamp_intersecting_max t1, b.timestamp_intersecting_min t2,
RANK () OVER (
PARTITION BY a.timestamp_intersecting_date
ORDER BY a.timestamp_intersecting_max DESC
) timestamp_d1_rank ,
RANK () OVER (
PARTITION BY b.timestamp_intersecting_date
ORDER BY b.timestamp_intersecting_max ASC
) timestamp_d2_rank,
a.coords_centroid, b.coords_centroid
FROM
signals a
INNER JOIN signals b ON (a."DID" = b."DID")
WHERE (b.timestamp_intersecting_date = a.timestamp_intersecting_date + INTERVAL '1 DAY')
AND a."DID" = b."DID"
--AND timestamp_d1_rank = 1
--AND timestamp_d2_rank = 1
ORDER BY a."DID", t1 desc, t2 asc
如何解决这个问题?
不能在
WHERE
子句中使用别名,也不能使用 Window 函数。为了演示,考虑这个例子(小提琴)。
然后运行以下两个查询:
和
您没有发布错误消息或 PostgreSQL 版本,但您的问题是
timestamp_d1_rank
并且timestamp_d2_rank
是别名。你有两个选择:
结果:
CTE
(aka此处WITH
概述的子句或@ypercubeᵀᴹ 上面的答案中的子句,也可以查看小提琴。有关这整个区域的一个很好的解释,请参见此处。
您不能在
WHERE
子句中使用窗口/排名函数或它们的别名,因为它们是在评估SELECT
之后在WHERE
中评估的。WHERE
在评估窗口函数之后,您可以使用子查询(派生表或 CTE)来处理第二个子句:现有答案已正确解决了与输入和输出列名称有关的语法规则的混淆。这是一个潜伏的性能问题。
CROSS JOIN
您的查询中有一个瞬态,随着每个("DID", date_col)
. 示例:如果 a"DID"
每天有 100 个坐标,则查询最终会处理 10.000 (!) 个与第二天的组合。基于这个假设的表定义:
假设每个只有几
("DID", date_col)
行,这个查询应该已经快得多了:需要在
("DID", date_col, time_col)
.根据您的实际设置和实际数据分布,此处可能会做更多工作。如果您有兴趣并提供缺失的信息,我会详细说明...