MYSQL 更新具有重复值但最早日期的行

标签 mysql max

尝试了很多建议来使其发挥作用,很难解释,所以下面是我拥有的数据和我想要实现的结果。

如果不是 MAX Ldate,我想将“Active”列更新为 0。

ID  | SNumber | Ldate      | Active
4804  188       2015-11-17   1
4806  189       2015-11-25   1
4807  190       2015-11-25   1
4808  191       2015-11-19   1
4809  192       2015-11-19   1
4820  193       2015-11-17   1
4821  193       2016-06-08   1
4830  194       2015-11-17   1
4831  194       2016-06-08   1
4828  195       2015-11-17   1
4829  195       2016-06-08   1


ID   SNumber  Ldate       Active    
4804 188      2015-11-17  1
4806 189      2015-11-25  1
4807 190      2015-11-25  1
4808 191      2015-11-19  1
4809 192      2015-11-19  1
4820 193      2015-11-17  0
4821 193      2016-06-08  1
4830 194      2015-11-17  0
4831 194      2016-06-08  1
4828 195      2015-11-17  0
4829 195      2016-06-08  1

我可以通过“select ID, SNumber, Ldate from (select * from tbl order by SNumber, Ldate desc) x group by SNumber”获取具有 MAX Ldate 的所有行

感谢您花时间查看!

最佳答案

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,SNumber INT NOT NULL
,Ldate DATE NOT NULL
);

INSERT INTO my_table VALUES
(4804,188,'2015-11-17'),
(4806,189,'2015-11-25'),
(4807,190,'2015-11-25'),
(4808,191,'2015-11-19'),
(4809,192,'2015-11-19'),
(4820,193,'2015-11-17'),
(4821,193,'2016-06-08'),
(4830,194,'2015-11-17'),
(4831,194,'2016-06-08'),
(4828,195,'2015-11-17'),
(4829,195,'2016-06-08');

SELECT x.*
     , COALESCE(x.ldate = y.ldate,0) active 
  FROM my_table x 
  LEFT 
  JOIN 
     ( SELECT snumber
            , MAX(ldate) ldate 
         FROM my_table 
        GROUP 
           BY snumber
     ) y 
    ON y.snumber = x.snumber 
   AND y.ldate = x.ldate;

+------+---------+------------+--------+
| id   | SNumber | Ldate      | active |
+------+---------+------------+--------+
| 4804 |     188 | 2015-11-17 |      1 |
| 4806 |     189 | 2015-11-25 |      1 |
| 4807 |     190 | 2015-11-25 |      1 |
| 4808 |     191 | 2015-11-19 |      1 |
| 4809 |     192 | 2015-11-19 |      1 |
| 4820 |     193 | 2015-11-17 |      0 |
| 4821 |     193 | 2016-06-08 |      1 |
| 4830 |     194 | 2015-11-17 |      0 |
| 4831 |     194 | 2016-06-08 |      1 |
| 4828 |     195 | 2015-11-17 |      0 |
| 4829 |     195 | 2016-06-08 |      1 |
+------+---------+------------+--------+

我不明白你为什么要存储这个,但是将上面的内容更改为更新很容易。它可能看起来像这样(显然,您需要首先更改上面的表格设计)...

UPDATE my_table x 
  LEFT
  JOIN 
     ( SELECT snumber
            , MAX(ldate) ldate 
         FROM my_table 
        GROUP 
           BY snumber
     ) y 
    ON y.snumber = x.snumber 
   AND y.ldate = x.ldate
   SET x.active = 0
 WHERE y.snumber IS NULL;

但我认为我通常会使用 INNER JOIN 进行更新,在这种情况下它可能看起来像这样(可能绑定(bind)在事务内)...

 UPDATE my_table SET active = 0;
 UPDATE my_table x 
   JOIN 
      ( SELECT snumber
             , MAX(ldate) ldate 
          FROM my_table 
         GROUP 
            BY snumber
      ) y 
     ON y.snumber = x.snumber 
    AND y.ldate = x.ldate
    SET x.active = 1;

关于MYSQL 更新具有重复值但最早日期的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50472193/

相关文章:

php - 关于规划 html/php 和多用户 Ajax 项目的最有效方法的建议

MySQL 最新帖子(按日期)

mysql - 进入数据库需要特别注意的符号有哪些

MySQL 创建一对一关系

mysql - SQL 查询? SELECT 这个查询的逆?

c# - 如何从 mysql 查询中存储对象 max(date) 和 min(date)

javascript - 从键/值对象对中查找最大值 Javascript

arrays - 查找元素数量差异最大的子数组

mysql - 如何选择最大值并返回多个条目

mysql - Sequelize cli 创建属于用户或员工的关联