Как прописать условия для группы данных?
Исходная таблица:
| ID | Название | Дата | Статус |
|---|---|---|---|
| 1 | Название1 | 01.01.2023 | Нет |
| 1 | Название2 | 05.04.2023 | Нет |
| 1 | Название3 | 12.08.2023 | Да |
| 2 | Название1 | 05.07.2023 | Нет |
| 2 | Название2 | 12.05.2023 | Нет |
| 2 | Название3 | 10.12.2023 | Нет |
Результат, который я хочу получить:
| ID | Название | Дата | Статус |
|---|---|---|---|
| 2 | Название1 | 05.07.2023 | Нет |
Мне необходимо получить результат по условию из первой таблицы :
- Статус по группе (по ID) у всех должен стоять "Нет".
- Выбрать минимальную строку с минимальной датой, если подходит под 1 пункт.
Ответы (2 шт):
Автор решения: teran
→ Ссылка
Сначала с помощью группировки и having выберите такие строки, где число записей равно числу строк с Нет, и минимальную дату к ним. Потом заджойните к базовой таблице. Примерно так:
WITH data AS (
SELECT id, MIN(date) AS dmin
FROM t
GROUP BY id
HAVING COUNT(id) = SUM(IF(status = 'нет', 1, 0))
)
SELECT t.*
FROM t
INNER JOIN data AS d ON (
d.id = t.id
AND d.dmin = t.date
)
Автор решения: Akina
→ Ссылка
SELECT TOP 1 *
FROM table t1
WHERE NOT EXISTS (
SELECT NULL
FROM table t2
WHERE t1.id = t2.id
AND t2.status = 'Да'
)
ORDER BY [date] ASC, id ASC;
Если имеется несколько id, для которых выполняется условие (1), будет возвращена одна запись для той группы, где дата самая наименьшая. Если таких групп несколько (минимальная дата одинакова), будет возвращена запись с минимальным id.