首页 > 解决方案 > 横向连接在一个简单的例子中失败

问题描述

我正在尝试使用横向同时创建一个时间序列和一个滞后:

dates as (
  SELECT generate_series(max(timestamp), min(timestamp), '1 week'::interval) as ts
  FROM batches,
  LATERAL (SELECT lag(ts) over (order by ts)) as prev_ts
),

出于某种原因,我得到了ERROR: column "ts" does not exist. 到底是怎么回事?

标签: postgresqllateral-join

解决方案


像这样的表函数generate_series属于该FROM子句,因为它们返回一个表而不是单个值:

SELECT g.ts,
       lag(g.ts) OVER (ORDER BY g.ts) AS prev_ts
FROM (SELECT max(timestamp) AS lts, min(timestamp) AS uts
      FROM batches) AS subq
   CROSS JOIN LATERAL
      generate_series(lts, uts, '1 week'::interval) as g(ts);

您收到错误不是因为您generate_seriesSELECT列表中使用,这是允许的,但可能具有意外语义,而是因为ts在列表中定义为别名SELECT而不是在FROM. 请记住,这FROM是在列表之前计算的SELECT,因此您不能在前者中使用后者中创建的别名。


推荐阅读