MySQL用另一个字段的值覆盖值

时间:2014-02-19 07:38:32

标签: mysql

这是我拥有的数据集:

 user_id     sum_min          sum_max  
----------  ---------------  -----------------
    38        300000.00          300000.00
    38        320000.00          320000.00
    38        340000.00          340000.00
    38        350000.00          350000.00
    38        380000.00          380000.00
    38        380000.00          380000.00
    38        400000.00          400000.00
    38        420000.00          420000.00
    38        450000.00          450000.00
    38        450000.00          450000.00
    38        480000.00          480000.00
    38        480000.00          480000.00
    38        500000.00          500000.00
    38        520000.00          520000.00

我需要做的是建立范围,例如sum_max的值是来自下一条记录的sum_min的值。 预期结果应为:

 user_id     sum_min          sum_max  
----------  ---------------  -----------------
    38        300000.00          320000.00
    38        320000.00          340000.00
    38        340000.00          350000.00 
    38        350000.00          380000.00
    38        380000.00          380000.00
    38        380000.00          380000.00

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

考虑以下内容......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,user_id     INT NOT NULL
,sum_min      INT NOT NULL
);

INSERT INTO my_table (user_id,sum_min) VALUES
(    38    ,   30),
(    38    ,    32),
(38        ,34),
(38        ,35),
(38        ,38),
(38        ,38),
(38        ,40),
(38        ,42),
(38        ,45),
(38        ,45),
(38        ,48),
(38        ,48),
(38        ,50),
(38        ,52);

SELECT x.user_id
     , x.sum_min
     , MIN(y.sum_min) sum_max 
  FROM my_table x 
  JOIN my_table y 
    ON y.user_id = x.user_id 
   AND y.sum_min > x.sum_min 
 GROUP 
    BY user_id
     , sum_min;

+---------+---------+---------+
| user_id | sum_min | sum_max |
+---------+---------+---------+
|      38 |      30 |      32 |
|      38 |      32 |      34 |
|      38 |      34 |      35 |
|      38 |      35 |      38 |
|      38 |      38 |      40 |
|      38 |      40 |      42 |
|      38 |      42 |      45 |
|      38 |      45 |      48 |
|      38 |      48 |      50 |
|      38 |      50 |      52 |
+---------+---------+---------+