SQL更新表中与同一表中另一条记录有关的一条记录

时间:2018-08-12 08:02:11

标签: sql postgresql

我有一个表,其中包含超过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;

上面的语句有什么问题?有任何想法或建议吗?

2 个答案:

答案 0 :(得分:1)

由于无法使用select子查询添加更新列而导致的错误。

您似乎想要获取该号码,该行icount的号码加上最后记录的aicount号码

我将使用LAG函数在子查询中获取最后记录的aicount号,然后更新该号码。

LAG函数中有三个参数。

  1. 首先获取您要获取的最后一列值的列。
  2. 此列的偏移量值默认为1
  3. 默认值。 默认为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