MySQL CASE, когда онемение равно нулю, игнорировать запись, где онемение не равно нулю - PullRequest
0 голосов
/ 06 марта 2019

У меня есть эти данные в таблице:

numb    m   value
8070    1   7.63
NULL    1   7.64
NULL    1   7.65
8070    2   7.939
8070    2   7.935
8070    2   7.941
NULL    3   7.62
8070    4   7.92
8070    4   7.935

Мне нужно MIN(value) и MAX(value) для каждого m, и если есть value без numb (NULL), то значения с a numb должны быть проигнорирован.

Так что я должен получить следующие результаты:

numb    m   value
NULL    1   7.64
NULL    1   7.65
8070    2   7.935
8070    2   7.941
NULL    3   7.62
8070    4   7.92
8070    4   7.935

Я пробовал много разных вещей, но, похоже, ничего не работает, и у меня больше нет идей, как найти соответствующую информацию. Не могли бы вы указать мне правильное направление?

UPDATE: чтобы получить количество значений, это выглядит так:

COALESCE(
IF(
  COUNT(
    CASE
      WHEN m IN (2, 4)
      THEN value
      ELSE
      CASE
        WHEN m IN (1, 3) AND numb IS NULL
        THEN value
      END
    END
  ) = 0,
  NULL,
  COUNT(
    CASE
      WHEN m IN (2, 4)
      THEN value
      ELSE
      CASE
        WHEN m IN (1, 3) AND numb IS NULL
        THEN value
      END
    END
  )
),
COUNT(
  CASE
    WHEN m IN (1, 3)
    AND numb IS NOT NULL
    THEN value
  END
)
) AS cnt

1 Ответ

1 голос
/ 06 марта 2019

Этот запрос должен дать вам результаты, которые вы хотите.Он имеет два уровня вложенных производных таблиц.Первое:

SELECT m,
       MIN(CASE WHEN numb IS NULL THEN value END) AS min_null,
       MAX(CASE WHEN numb IS NULL THEN value END) AS max_null,
       MIN(CASE WHEN numb IS NOT NULL THEN value END) AS min_normal,
       MAX(CASE WHEN numb IS NOT NULL THEN value END) AS max_normal
FROM numbers
GROUP BY m;

вычисляет минимальное и максимальное значения для каждого значения m, в зависимости от того, было ли numb числом или NULL.На следующем уровне,

SELECT m,
       COALESCE(min_null, min_normal) AS min_value,
       COALESCE(max_null, max_normal) AS max_value
FROM (... query 1...)

, который мы используем, вычисляем соответствующие минимальные и максимальные значения для использования (если было значение NULL, мы используем его, в противном случае мы используем значение, связанное с числовыми значениями numb).Наконец, мы JOIN таблица чисел к результату запроса 2, чтобы найти соответствующие значения numb для каждого значения m:

SELECT n.numb, n.m, n.value
FROM numbers n
JOIN (... query 2 ...) num ON num.m = n.m AND (num.min_value = n.value OR num.max_value = n.value)
ORDER BY n.m, n.value

Вывод:

numb    m   value
null    1   7.64
null    1   7.65
8070    2   7.935
8070    2   7.941
null    3   7.62
8070    4   7.92
8070    4   7.935

Демонстрация на dbfiddle

Полный запрос:

SELECT n.numb, n.m, n.value
FROM numbers n
JOIN (SELECT m,
             COALESCE(min_null, min_normal) AS min_value,
             COALESCE(max_null, max_normal) AS max_value
      FROM (SELECT m,
                   MIN(CASE WHEN numb IS NULL THEN value END) AS min_null,
                   MAX(CASE WHEN numb IS NULL THEN value END) AS max_null,
                   MIN(CASE WHEN numb IS NOT NULL THEN value END) AS min_normal,
                   MAX(CASE WHEN numb IS NOT NULL THEN value END) AS max_normal
            FROM numbers
            GROUP BY m) n) num ON num.m = n.m AND (num.min_value = n.value OR num.max_value = n.value)
ORDER BY n.m, n.value
...