[英]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
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.