Изменить первое значение для столбца для каждого идентификатора

#mysql

#mysql

Вопрос:

У меня есть таблица в MySQL следующим образом:

  ---- ------------------- ---- 
| ID |       Date        |    |
 ---- ------------------- ---- 
| A  |    '2019-01-05'   |    |
| A  |    '2019-01-06'   |    |
| A  |    '2019-01-04'   |    |
| B  |    '2019-06-07'   |    |
| B  |    '2019-06-25'   |    |
| C  |    '2019-05-05'   |    |
| B  |    '2019-04-10'   |    |
 ---- ------------------- ---- 

  

Я хочу добавить count столбец так, чтобы для каждого уникального идентификатора количество было установлено равным 1 на самую раннюю дату, в противном случае оно равно 0. Таким образом, приведенная выше таблица должна выглядеть следующим образом

  ---- ----------------- -- --------- 
| ID |      Date       |  |   Count |
 ---- ----------------- -- --------- 
| A  |    '2019-01-05' |  |       0 |
| A  |    '2019-01-06' |  |       0 |
| A  |    '2019-01-04' |  |       1 |
| B  |    '2019-06-07' |  |       0 |
| B  |    '2019-06-25' |  |       0 |
| C  |    '2019-05-05' |  |       1 |
| B  |    '2019-04-10' |  |       1 |
 ---- ----------------- -- --------- 

  

Я попытался создать новую таблицу, SELECT DISTINCT ID, min(Date) FROM table; чтобы получить самую раннюю дату для каждого уникального идентификатора в строке, а затем присоединиться к исходной таблице в этой небольшой таблице «поиска», но SELECT DISTINCT ID, min(Date) FROM table; в данном случае мне дается только одна строка, а не три.

Комментарии:

1. Вам нужно GROUP BY ID

2. @Barmar OP нуждается в ОБНОВЛЕНИИ, а не в ВЫБОРЕ. Оптимальное решение НЕ использует GROUP BY . Решение, на которое вы ссылаетесь, НЕ решает задачи OP.

3. @Akina Он создает другую таблицу, к которой он собирается присоединиться, чтобы найти строку с минимальным значением, которое требуется GROUP BY .

4. @Barmar дублирующая ссылка не имеет никакого отношения к этому требованию. OP не хочет считать.

5. Это одна и та же проблема и решение для всех функций агрегирования.

Ответ №1:

Вы можете сделать это с помощью коррелированного подзапроса:

 select t.*,
  t.Date = (select min(Date) from tablename where id = t.id) as Count
from tablename t
  

Ответ №2:

Вам нужно сгруппировать по идентификатору, чтобы получить минимум для каждого.

 UPDATE table AS t1
JOIN (
    SELECT ID, MIN(date) AS minDate
    FROM table
    GROUP BY ID
) AS t2 ON t1.ID = t2.ID and t1.date = t2.minDate
SET t1.count = 1