MYSQL - ВЫБЕРИТЕ NULL, в противном случае последняя дата для группы - PullRequest
0 голосов
/ 08 мая 2019

В моей базе данных есть следующие данные:

| ID   | FK_ID  | MODEL | DATE              | 
+------+--------+-------+-------------------+
|1     | 11     | m1    |NULL               |
|2     | 11     | m1    |NULL               |
|3     | 11     | m2    |2019-05-08 12:04:24|
|4     | 11     | m2    |2019-05-08 12:07:43|
|5     | 11     | m2    |2019-05-08 12:08:37|
|6     | 11     | m3    |2019-05-08 12:13:19|
|7     | 11     | m3    |NULL               |
|8     | 12     | m7    |2019-05-08 12:04:14|

Я хочу получить самую последнюю ДАТУ каждой МОДЕЛИ, но если ДАТА для МОДЕЛИ равна нулю, то я хочу получить НЕДЕЙСТВИТЕЛЬНОЕ вместо самой последней даты.

Ожидаемый результат

| MODEL | DATE              |
+-------+-------------------+
| m1    |NULL               |
| m2    |2019-05-08 12:08:37|
| m3    |NULL               |

Я попробовал следующий запрос:

SELECT MODEL, DATE FROM MODEL_TABLE
WHERE FK_ID = 11 AND (DATE IN ( 
    SELECT MAX(DATE)
    FROM MODEL_TABLE
    GROUP BY MODEL
) OR DATE IS NULL)
GROUP BY MODEL;

Но я получаю следующий результат:

Фактический вывод (неверный)

| MODEL | DATE              |
+-------+-------------------+
| m1    |NULL               |
| m2    |2019-05-08 12:08:37|
| m3    |2019-05-08 12:13:19|

Может кто-нибудь сообщить мне, как можно исправить запрос, чтобы получить ожидаемый результат

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Вы можете использовать условное агрегирование:

select model,
       (case when count(*) = count(date) then max(date) end) as max_date
from model_table mt
group by model;

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

       (case when count(date is null) = 0 then max(date) end) as max_date
2 голосов
/ 08 мая 2019

count(*) считает все строки, count(date) считает ненулевые значения.Если они одинаковы, нулевого значения не существует, т.е. вернуть max (date), иначе вернуть null.

SELECT MODEL, case when count(*) = count(DATE) then max(DATE) end
FROM MODEL_TABLE
group by MODEL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...