MySQL CASE WHEN numb IS NULL 忽略记录 WHERE numb IS NOT NULL

标签 mysql group-by max min

我的表中有这些数据:

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

对于每个m,我需要MIN(value)MAX(value),并且如果有一个 code> 没有 numb (NULL),那么那些 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

我尝试了很多不同的方法,但似乎没有任何效果,而且我不知道如何查找相关信息。你能指出我正确的方向吗?

更新: 要获取值的数量,如下所示:

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

最佳答案

这个查询应该会给你你想要的结果。它有两层嵌套派生表。第一个:

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的结果,为每个m值找到适当的numb值:

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

Demo on 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

关于MySQL CASE WHEN numb IS NULL 忽略记录 WHERE numb IS NOT NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55022725/

相关文章:

sql-server-2008 - 通过加入和分组更新表

MySQL:主从查询中包含 WHERE 语句的不同结果?

java - 二维数组中最大值和最小值的差异

java - 在数组的每一列中查找最小值和最大值

php - 选择带有 php 和 mysql 的 Html

MySQL:从逗号分隔的列表/列表中选择作为表? "SELECT a FROM (1, 2, 3)"

php - UTF-8 编码在 PHP 中不起作用

mysql - 使用 MySQL 计算累计值

mysql使用列的总和来获取每组的总金额

r - 获取r中具有最大日期的所有相应行