我有一个表,其中包含超过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语句,但出现语法错误“错误:“选择”位置或附近的语法错误: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;
上面的语句有什么问题?有任何想法或建议吗?
答案 0 :(得分:1)
由于无法使用select
子查询添加更新列而导致的错误。
您似乎想要获取该号码,该行icount
的号码加上最后记录的aicount
号码
我将使用LAG函数在子查询中获取最后记录的aicount
号,然后更新该号码。
LAG
函数中有三个参数。
null
lag(值any [,偏移整数[,default any]])
返回在分区中当前行之后偏移行的行求值;如果没有这样的行,则返回默认值。偏移量和默认值均针对当前行进行评估。如果省略,则offset默认为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
Results :
| tsid | plisid | plifc | plisc | dt | icount | aicount |
|------|--------|-------|-------|----|--------|---------|
| 10 | 1 | 0 | 0 | 0 | 2 | 2 |
| 11 | 1 | 0 | 0 | 0 | 7 | 9 |
答案 1 :(得分:1)
尝试以下查询-:
update T
set aicount=mm.m
from(
select sum(iCount) over (partition by plisid,plifc,plisc,dt order by tsid) m from T
) mm
SQL Server