sql - SQL 更新表中的记录,涉及同一表中的另一条记录
问题描述
我有一个包含超过 16,000,000 条记录的表。每条记录都有一个主键(由五个字段“tsid、plisid、plifc、plisc、dt”组成)和两个计数器字段(“icount、aicount”)。
表中的一些记录之间存在关系。
为了简化问题,假设我们只有这两条记录
tsid, plisid, plifc, plisc, dt, icount, aicount
10 1 0 0 0 2 2
11 1 0 0 0 7 0
要求:
我想将第二条记录中的“aicount”字段更新为9(即第二条记录中的“icount”+第一条记录中的“aicount”)。第一条记录和第二条记录的关系是它们在(plisid, plifc, plisc, dt)中的值相同,第二条记录的tsid值==第一条记录的tsid+1
更新后想要的结果是:
tsid, plisid, plifc, plisc, dt, icount, aicount
10 1 0 0 0 2 2
11 1 0 0 0 7 9
我在 PostgreSQL 中尝试了这个 SQL 语句,但出现语法错误“错误:在“SELECT”位置或附近出现语法错误:59”
UPDATE table1 SET
table1.aicount = table1.icount + SELECT COALESCE( (SELECT CASE
WHEN table1temp.aicount IS NULL
THEN 0
ELSE table1temp.aicount
END
FROM table1 table1temp
WHERE table1temp.tsid = table1.tsid - 1
AND table1temp.plisid = table1.plisid
AND table1temp.plifc = table1.plifc
AND table1temp.plisc = table1.plisc
AND table1temp.dt = table1.dt), 0)
WHERE table1.tsid = 10;
上面的陈述有什么问题?有什么想法或建议吗?
解决方案
由于您无法使用select
子查询添加更新列而导致的错误。
你似乎想得到这个行icount
号与最后记录的数字相加的aicount
数字
我会使用LAG函数在子查询中获取最后记录aicount
的数字,然后更新数字。
函数中有三个参数LAG
。
- 首先是您的列,您想要获取最后一列的值。
- 此列值的偏移量默认为 1
- 默认值。默认为
null
滞后(值任何[,偏移整数[,默认任何]])
返回在分区内当前行之后的偏移行处计算的值;如果没有这样的行,则返回默认值。偏移量和默认值都相对于当前行进行评估。如果省略,偏移量默认为 1,默认为 null
创建表T(tsid int,plisid int,plifc int,plisc int,dt int,icount int,aicount int);
INSERT INTO T VALUES (10,1,0,0,0,2,2);
INSERT INTO T VALUES (11,1,0,0,0,7,0);
UPDATE T
SET aicount = t1.totle
FROM
(
SELECT *,(LAG(aicount,1,0) over(order by tsid) + icount) totle
FROM T
) t1
WHERE
T.tsid = t1.tsid
AND T.plisid = t1.plisid
AND T.plifc = t1.plifc
AND T.plisc = t1.plisc
AND T.dt = t1.dt
查询 1:
SELECT * FROM T
结果:
| tsid | plisid | plifc | plisc | dt | icount | aicount |
|------|--------|-------|-------|----|--------|---------|
| 10 | 1 | 0 | 0 | 0 | 2 | 2 |
| 11 | 1 | 0 | 0 | 0 | 7 | 9 |
推荐阅读
- javascript - 单选按钮总是返回“是”值
- c# - c#按空格分割函数是按字符分割字符串
- php - 使用 PHP 在 html 字符串中删除 AMP 页面的自定义标签
- ios - iOS - @available 在这里不保护可用性;使用 if (@available) 代替
- kubernetes - echo 容器镜像:kubernetes readinessProbe 或 livenessProbe 中的标签(URI)
- google-maps - Google Maps Geo Location Store Locator Demo 链接未在 ie11 中显示
- python - 具有多列的 Pandas 数据框条件流
- javascript - 菜单使用引导程序在移动版本中下推图像?
- python - 解决 Cassandra Coordinator 节点写入超时的方法
- java - 为消费者和生产者创建休息端点