简体   繁体   English

当麻木为空时,MySQL CASE忽略麻木为非空的记录

[英]MySQL CASE WHEN numb IS NULL ignore record WHERE numb IS NOT NULL

I have these data in a table: 我在表中有这些数据:

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

I need MIN(value) and MAX(value) for each m , and if there is a value without numb (NULL), then the ones with a numb should be ignored. 我需要MIN(value)MAX(value)为每个m ,并且如果有一个value ,而不numb (NULL),然后的那些numb应该被忽略。

So I should be getting the following results: 所以我应该得到以下结果:

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

I've tried quite a lot of different things, but nothing seems to work, and I have no more ideas how to find relevant info. 我已经尝试了很多不同的方法,但是似乎没有任何效果,而且我也没有找到如何找到相关信息的想法。 Can you please point me to the right direction? 您能指出我正确的方向吗?

UPDATE: to get the number of values it looks like this: 更新:要获取值的数量,它看起来像这样:

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

This query should give you the results you want. 此查询应为您提供所需的结果。 It has two levels of nested derived tables. 它具有两层嵌套的派生表。 The first: 首先:

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;

computes the minimum and maximum values for each value of m , dependent on whether numb was a number or NULL . 根据numb是数字还是NULL计算m每个值的最小值和最大值。 In the next level, 在下一级别,

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

we use compute the appropriate minimum and maximum values to use (if there was a NULL value, we use that, otherwise we use the one associated with numeric values of numb ). 我们使用计算合适的最小值和最大值来使用(如果存在NULL值,则使用该值,否则使用与numb数值相关联的值)。 Finally we JOIN the numbers table to the result of query 2 to find the appropriate values of numb for each value of m : 最后,我们将数字表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

Output: 输出:

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 dbfiddle上的演示

The full query: 完整查询:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM