Как прописать условия для группы данных?

Рейтинг: 0Ответов: 2Опубликовано: 10.05.2023

Исходная таблица:

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 Нет

Мне необходимо получить результат по условию из первой таблицы :

  1. Статус по группе (по ID) у всех должен стоять "Нет".
  2. Выбрать минимальную строку с минимальной датой, если подходит под 1 пункт.

Ответы

▲ 0Принят

Сначала с помощью группировки и 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
)
▲ 0
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.