代码之家  ›  专栏  ›  技术社区  ›  A. Student

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

  •  1
  • A. Student  · 技术社区  · 6 年前

    我有一张表,里面有超过16000000条记录。 每个记录都有一个主键(由五个字段“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”位置或附近得到一个语法错误“error:syntax error: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 回复  |  直到 6 年前
        1
  •  1
  •   D-Shih    6 年前

    由于无法使用 select

    你好像想知道这个号码 icount 最后记录的数字相加 aicount

    我会用 LAG 艾肯

    有三个参数 LAG 功能。

    1. 首先是列,要获取最后一个列的值。
    2. 距此列的偏移量 值默认为1
    3. 默认值。 默认为 null

    滞后(值任意[,偏移整数[,默认值任意]])

    返回在分区中当前行之后偏移行的行上计算的值;如果没有这样的行,则返回默认值。偏移量和默认值都是根据当前行计算的。如果省略,则偏移量默认为1,默认为空

    tsid内景, 普利希德国际机场, plisc国际, 内景, aicount国际 );

    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
    

    :

    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 |
    
        2
  •  1
  •   IShubh    6 年前

    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服务器