В MySQL возвращает максимальное значение или null, если столбец имеет значение

Я пытаюсь получить максимальное значение MySQL select, но хочу иметь его null/empty / 0, если есть одна строка, не содержащая метки времени.

статистика таблицы (simplyfied):

   ID   CLIENT   ORDER_DATE      CANCEL_DATE

    1     5      1213567200
    2     5      1213567200
    3     6      1210629600      1281736799
    4     6      1210629600      1281736799
    5     7      1201042800      1248386399
    6     7      1201042800      
    7     8      1205449200      1271282399

Теперь я ищу, чтобы получить самую низкую дату заказа (без проблем, так как она никогда не пуста), и максимальная дата отмены. Если клиент уже отменил подписку, дата отмены заполняется, но если он все еще активен, дата отмены вообще отсутствует.

запрос:

SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT

возвращает:

ID    OD           CD
 5    1213567200                  // fine
 6    1210629600   1281736799     // fine
 7    1201042800   1248386399     // Should be empty
 8    1205449200   1271282399     // fine

Я не могу понять, как вернуть пустой/0/NULL, если есть один (или несколько) пустых colums для клиента. Также пробовал с нулевыми полями.

Спасибо за любую подсказку.

2 ответов


Я не знаю как быстро это будет, но я думаю, это можно решить так:

SELECT ID, min(ORDER_DATE) AS OD,
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD 
FROM stats GROUP BY CLIENT

Я не могу проверить это, но идея этого решения заключается в том, что count(cancel_date) следует считать все записи не нулевого значения, и если он равен count(*) это означает, что нет нулевых значений, и он вернет max(cancel_date), в противном случае null.


вы можете использовать такой запрос:

SELECT
  client,
  min(ORDER_DATE) AS OD,
  case when MAX(CANCEL_DATE IS NULL)=0 THEN max(CANCEL_DATE) END AS CD
FROM
  stats
GROUP BY
  CLIENT

пожалуйста, смотрите fiddle здесь.

  • CANCEL_DATE IS NULL будет оцениваться либо до 0, когда CANCEL_DATE не равен null, либо до 1, когда он равен null
  • MAX(CANCEL_DATE IS NULL) будет оцениваться как 0, если нет cancel_date со значениями null, иначе его значение будет 1.
  • , когда MAX(CANCEL_DATE IS NULL)=0 это означает, что нет строк, где CANCEL_DATE равно null, и нам нужно вернуть MAX (cancel_date) в этом case, в противном случае нам нужно вернуть NULL.