我有一张桌子。 一共有三列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
谢谢
答案 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)