gpt4 book ai didi

MySQL:如何计算过滤数据集上的行数(在不同条件下)?

转载 作者:行者123 更新时间:2023-11-29 06:48:33 25 4
gpt4 key购买 nike

由于我对 MySQL 的了解有限我找不到合适的语法来实现我想要在 MySQL 中获得的内容(MariaDB 10.0;无法将其升级到更新的版本):

  1. 上传最近24小时的数据(本例为:CPU_load;实际情况生活中,它可能是一个计算量大的过滤,而不是像本例中那样简单的最后 24 小时);

  2. 对过滤后的集合中满足不同条件的值进行计数。

单个查询“过去 24 小时内有多少个值高于 95%?”很简单:

SELECT COUNT(*)
FROM (
SELECT *
FROM `server-statistics`
WHERE `Date_Time` >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 DAY)
) as H24
WHERE CPU_load > 95

为了便于解释,我保留了 H24 的(此处无用的)定义。

问题

如果我要考虑多个条件(即:>过去 24 小时内为 90%、过去 24 小时内 >95%、过去 24 小时内 >98% 等)与前一个类似的许多查询,过滤后的组 H24 会一遍又一遍地重新计算。

如果它在调用之间缓存,这不是一个真正的问题,但我更愿意在一次调用中对多个条件下的行进行计数。

在伪 SQL 中,它应该类似于:

SELECT COUNT(*) WHERE CPU_load > 90,
COUNT(*) WHERE CPU_load > 95,
COUNT(*) WHERE CPU_load > 98
FROM `server-statistics`
WHERE `Date_Time` >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 DAY)

纯MySQL可能吗?

最佳答案

您可以使用CASE作为条件计数,如下所示

SELECT SUM(CASE WHEN CPU_load BETWEEN 90 AND 94 THEN 1 ELSE 0 END) AS A1,
SUM(CASE WHEN CPU_load BETWEEN 95 AND 97 THEN 1 ELSE 0 END) AS A2,
SUM(CASE WHEN CPU_load > 98 THEN 1 ELSE 0 END) AS A3
FROM `server-statistics`
WHERE `Date_Time` >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 DAY)

对范围内的数据进行计数似乎更有意义,但如果您仍然想保持自己的条件,请改为使用以下内容:

SUM(CASE WHEN CPU_load > 90 THEN 1 ELSE 0 END) AS A1
SUM(CASE WHEN CPU_load > 95 THEN 1 ELSE 0 END) AS A2
SUM(CASE WHEN CPU_load > 98 THEN 1 ELSE 0 END) AS A3

将十进制值寻址为 94.5

--Adjust the comparison value according to your requirement just provided the example.

SUM(CASE WHEN CPU_load > 90 AND CPU_load <= 95 THEN 1 ELSE 0 END) AS A1
SUM(CASE WHEN CPU_load > 95 AND CPU_load <= 98 THEN 1 ELSE 0 END) AS A2
SUM(CASE WHEN CPU_load > 98 THEN 1 ELSE 0 END) AS A3

关于MySQL:如何计算过滤数据集上的行数(在不同条件下)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com