MySQL:获取上一个行分组

标签 mysql

如何获取mysql中的上一行? 例如我有数据:

serial........date..............value
xxx...........2016.01.03...3
xxx...........2016.01.02...2
xxx...........2016.01.01...1
yyy...........2016.01.03...3
yyy...........2016.01.02...2
yyy...........2016.01.01...1

我需要得到这个:

serial........date..............value..value_prev
xxx...........2016.01.03...3........2
xxx...........2016.01.02...2........1
xxx...........2016.01.01...1........null
yyy...........2016.01.03...3........2
yyy...........2016.01.02...2........1
yyy...........2016.01.01...1........null

不同的例子:

serial........date.........value....value_prev
xxx...........2016.01.03...12.......5
xxx...........2016.01.02...5........3
xxx...........2016.01.01...3........null
yyy...........2016.01.03...9........6
yyy...........2016.01.02...6........1
yyy...........2016.01.01...1........null

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(serial CHAR(3) NOT NULL
,date DATE NOT NULL
,value INT NOT NULL
,PRIMARY KEY (serial,date)
);

INSERT INTO my_table VALUES
('xxx','2016-01-03',12),
('xxx','2016-01-02',5),
('xxx','2016-01-01',3),
('yyy','2016-01-03',9),
('yyy','2016-01-02',6),
('yyy','2016-01-01',1);

SELECT x.* 
     , MAX(y.value) prev 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.serial = x.serial 
   AND y.date < x.date 
 GROUP 
    BY x.serial
     , x.date;
+--------+------------+-------+------+
| serial | date       | value | prev |
+--------+------------+-------+------+
| xxx    | 2016-01-01 |     3 | NULL |
| xxx    | 2016-01-02 |     5 |    3 |
| xxx    | 2016-01-03 |    12 |    5 |
| yyy    | 2016-01-01 |     1 | NULL |
| yyy    | 2016-01-02 |     6 |    1 |
| yyy    | 2016-01-03 |     9 |    6 |
+--------+------------+-------+------+

关于MySQL:获取上一个行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34894827/

相关文章:

php - mysql php数组转特定格式

mysql - 如何使用路径位置获取MySQL中的记录?

PHP SESSION 变量未从 MySQL 记录插入

php - 如何使用 count() 聚合 fn 与 android、json 和 php

MySQL INSERT 查询在存储过程中不起作用

Mysql 内连接 vs in 子句性能

php - 可以将我的 php 应用程序中的时区设置为应用程序实际位置以外的时区吗?

mysql - SELECT * 真的比只选择需要的列花费更多的时间吗?

php - 缓慢插入和更新到大表

java - 强制JDBC不使用代理