SQL MySQL UPDATE TABLE将一个列复制到同一表中的其他列,这样第一列的第n行=第二列的n + 1行?

时间:2018-08-19 18:20:59

标签: mysql sql

我有一张桌子。 一共有三列Serialno,Businessdate,Firstdate

我想将Businessdate的日期复制到Firstdate,以使Businessdate的第一行成为Firstdate的第二行,依此类推。

Businessdate的第n行= Firstdate的第n + 1行

所以,这就是表Disposed-

中的内容
Serialno  BusinessOnDate  FirstDate
1         2017-04-17       NULL
2         2017-04-24       NULL
3         2017-04-03       NULL
4         2017-03-18       NULL
5         2017-03-27       NULL
6         2017-03-20       NULL

我想要的

Serialno  BusinessOnDate  FirstDate
1         2017-04-17       NULL
2         2017-04-24      2017-04-17
3         2017-04-03      2017-04-24
4         2017-03-18      2017-04-03
5         2017-03-27      2017-03-18
6         2017-03-20      2017-03-27

谢谢

3 个答案:

答案 0 :(得分:1)

您需要使用LAG函数。如果您的mysql版本不支持,可以尝试使用子查询来使LAG起作用。

SELECT t1.Serialno,t1.BusinessOnDate,(
          SELECT BusinessOnDate 
          FROM T tt
          WHERE tt.Serialno < t1.Serialno
          order by Serialno desc
          limit 1
         ) 
FROM T t1

如果您的mysql支持lag,可以尝试一下。

SELECT 
    t1.Serialno,
    t1.BusinessOnDate,
    LAG(t1.BusinessOnDate) OVER(ORDER BY Serialno) FirstDate
FROM T t1

如果要更新,可以尝试使用子查询self join

CREATE TABLE T(
   Serialno int,
   BusinessOnDate date,
   FirstDate date
);

INSERT INTO T VALUES (1,'2017-04-17',NULL);

INSERT INTO T VALUES (2,'2017-04-24',NULL);
INSERT INTO T VALUES (3,'2017-04-03',NULL);
INSERT INTO T VALUES (4,'2017-03-18',NULL);
INSERT INTO T VALUES (5,'2017-03-27',NULL);
INSERT INTO T VALUES (6,'2017-03-20',NULL);

UPDATE T t1
JOIN (
      SELECT t1.Serialno,
         (
                  SELECT BusinessOnDate 
                  FROM T tt
                  WHERE tt.Serialno < t1.Serialno
                  order by Serialno desc
                  limit 1
         )  as 'FirstDate'
      FROM T t1
) t2 on t1.Serialno = t2.Serialno
SET t1.FirstDate = t2.FirstDate

查询1

SELECT * FROM T

Results

| Serialno | BusinessOnDate |  FirstDate |
|----------|----------------|------------|
|        1 |     2017-04-17 |     (null) |
|        2 |     2017-04-24 | 2017-04-17 |
|        3 |     2017-04-03 | 2017-04-24 |
|        4 |     2017-03-18 | 2017-04-03 |
|        5 |     2017-03-27 | 2017-03-18 |
|        6 |     2017-03-20 | 2017-03-27 |

答案 1 :(得分:0)

大概您想更新表。 serialno似乎描述了顺序。因此,您可以使用join

update t join
       t tprev
       on tprev.serialno = t.serialno - 1
    set t.firstdate = tprev.businessondate;

答案 2 :(得分:0)

从子查询获取上一个日期

UPDATE disposed d1 SET firstdate = (SELECT MAX(businessondate) 
                                    FROM disposed d2 
                                    WHERE d2. businessondate < d1. businessondate 
                                    ORDER BY businessondate)