我有一个表已处理。 有三列序列号、营业日期、第一日期
我想将 Businessdate 的日期复制到 Firstdate,使 Businessdate 的第一行成为 Firstdate 的第二行,依此类推。
营业日期的第 n 行 = 第一个日期的第 n+1 行
所以,这就是我在表中处理的内容-
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
谢谢
您需要使用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
结果:
| 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 |
大概你想更新表。serialno
似乎描述了排序。 因此,您可以使用join
:
update t join
t tprev
on tprev.serialno = t.serialno - 1
set t.firstdate = tprev.businessondate;
从子查询获取上一个日期
UPDATE disposed d1 SET firstdate = (SELECT MAX(businessondate)
FROM disposed d2
WHERE d2. businessondate < d1. businessondate
ORDER BY businessondate)