【发布时间】:2021-05-20 23:24:04
【问题描述】:
我正在尝试重构查询并删除一组窗口函数,以按原样捕获所有记录。当我去粘贴查询以替换我的函数时,pgAdmin 在“截断”语句附近指示语法错误。我只是无法弄清楚它是什么,并且可能是一些非常明显的东西,但我会欣赏另一(或许多)眼睛。
我在 Postgres 10.12 上。
这是我要插入的代码(最后包含了“之前”代码。任何建议将不胜感激。尝试了括号、逗号和分号闭包的所有类型和组合,并在斗智斗勇……
我正在尝试插入的代码
预期结果:从暂存中取出行并插入到目标中。完成后截断暂存
WITH ins_agent AS (
INSERT INTO agents (
currentagentsnapshot,
previousagentsnapshot,
agentarn,
eventid,
eventtimestamp,
eventtype,
instancearn)
SELECT
agent_stg.currentagentsnapshot::jsonb AS currentagentsnapshot,
agent_stg.previousagentsnapshot::jsonb AS previousagentsnapshot,
agent_stg.agentarn::text AS agentarn,
agent_stg.eventid::text AS eventid,
agent_stg.eventtimestamp::timestamptz AS eventtimestamp,
agent_stg.eventtype::text AS eventtype,
agent_stg.instancearn::text AS instancearn
FROM agents_staging AS agent_stg
WHERE agent_stg.agentarn IS NOT NULL)
TRUNCATE agents_staging;
我正在尝试更改的代码
预期结果:选择不同的代理并捕获他们最近的快照。将 agent_id 插入另一个表。考虑 upserts。
更改原因:除了需要对数百万条记录进行查询之外,它几乎没有任何价值,因为它会丢弃所有代理快照,因为它们是不同的,除了它们的最新快照。不是我们想要的。
WITH ins_agent AS (INSERT INTO agents (currentagentsnapshot,
previousagentsnapshot,
agentarn,
eventid,
eventtimestamp,
eventtype,
instancearn)
SELECT DISTINCT LAST_VALUE(currentagentsnapshot::jsonb)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC ) AS previousagentsnapshot,
LAST_VALUE(previousagentsnapshot::jsonb)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC ) AS previousagentsnapshot,
agentarn,
LAST_VALUE(eventid)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC) AS eventid,
LAST_VALUE(lat.eventtimestamp)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC) AS eventtimestamp,
LAST_VALUE(eventtype)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC) AS eventtype,
LAST_VALUE(instancearn)
OVER (PARTITION BY agentarn ORDER BY lat.eventtimestamp DESC) AS instancearn
FROM agents_staging AS agent
CROSS JOIN LATERAL (SELECT agent.eventtimestamp::timestamp AS eventtimestamp) AS lat
WHERE NOT (
agent.agentarn IS NULL
OR agent.currentagentsnapshot IS NULL
OR agent.currentagentsnapshot = '{}')
ON CONFLICT (agentarn)
DO NOTHING
RETURNING agentarn, agent_id)
UPDATE contact_trace_records
SET agent_id=ins_agent.agent_id
FROM ins_agent
WHERE contact_trace_records.agent_id IS NULL
AND ins_agent.agentarn = contact_trace_records.agent ->> 'ARN';
TRUNCATE agents_staging;
【问题讨论】:
-
不确定 Aurora 语法是否与普通 PostgreSql 不同,但它是否像在
WHERE agent_stg.agentarn IS NOT NULL)之后在TRUNCATE之前使用括号而不是分号一样简单? -
@mdisibio - 这是令人沮丧的事情。所以括号是用来关闭行首的 with 子句的。然后我在结尾加上一个分号。这引发了一个错误。试图在“where”之后用分号截断并引发错误。甚至试图不关闭“with”,但这也会引发错误。呃……
标签: sql postgresql common-table-expression aws-aurora-serverless sql-truncate