#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