MYSQL Обновить строки с повторяющимся значением, но самой старой датой

0

Пробовал много предложений, чтобы заставить это работать, трудно объяснить, поэтому ниже приведены данные, которые у меня есть, и результат, которого я хочу достичь.

Я хочу обновить "Active" Column до 0, если это не MAX 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   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

Я могу получить все строки с MAX Ldate с помощью "select ID, SNumber, Ldate from (выберите * из tbl order by SNumber, Ldate desc) x group by SNumber"

Спасибо, что нашли время посмотреть!

  • 0
    Вы уверены, что хотите хранить производные данные? кстати, ваш существующий запрос опирается на старый хак, результат которого не может быть гарантирован в более поздних версиях MySQL. (На самом деле, это никогда не может быть гарантировано, но это другая история)
  • 0
    Ах, хорошо, я буду искать лучшее решение тогда. В любом случае, спасибо за поиск.
Теги:
max

1 ответ

2
Лучший ответ
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. Это может выглядеть примерно так (очевидно, вам нужно сначала изменить дизайн таблицы)...

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 для UPDATE, и в этом случае он может выглядеть так (возможно, связанный внутри транзакции)...

 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;
  • 0
    Работает отлично! Спасибо ... Да, я хочу изменить его на ОБНОВЛЕНИЕ ... "достаточно легко" (легко сказать) ... Я пытался ... и потерпел неудачу.
  • 0
    Ну, обновите свой вопрос, чтобы показать нам, что вы пытались
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню