postgresql - 横向连接在一个简单的例子中失败
问题描述
我正在尝试使用横向同时创建一个时间序列和一个滞后:
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
. 到底是怎么回事?
解决方案
像这样的表函数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_series
在SELECT
列表中使用,这是允许的,但可能具有意外语义,而是因为ts
在列表中定义为别名SELECT
而不是在FROM
. 请记住,这FROM
是在列表之前计算的SELECT
,因此您不能在前者中使用后者中创建的别名。
推荐阅读
- php - Jquery Ajax日历每隔一个月跳过一次
- django - 如果已登录则重定向
- node.js - 需要 Babel "^7.0.0-0",但加载的是 "6.26.3"
- apache - Apache 返回默认服务器 SSL 证书而不是正确的证书
- android - Apk 元信息警告
- excel - 根据 Active-x Dropdown 自动填充一行中的单元格
- json - Hive SerDe 使用 JSON 推文返回错误 Flume
- c# - EF:包含 where 子句,+ SubIncludes
- java - Maven 依赖问题:提供和编译依赖一起工作
- javascript - Typescript 在整个项目中共享原始类型的自定义方法