【问题标题】:How to count values within a range in my MySQL table如何计算 MySQL 表中某个范围内的值
【发布时间】:2023-01-13 05:56:01
【问题描述】:

你好,我正在尝试计算每个范围内的值,例如在我的 DURATION_IN_MS 列中的 115000 - 120000 之间。

我的专栏看起来像这样:

119631
120689
143498
119798
WITH tab1 AS(
SELECT TOP 30 * 
FROM MACHINE_PROCESSING_DURATION_EVALUATION
WHERE START_TIMESTAMP BETWEEN '2022-11.10 00:00:00.000' AND '2022-11.10 22:00:00.000')


SELECT(
  case 
    when DURATION_IN_MS BETWEEN 115000 AND 120000 THEN '115000-120000'
    when DURATION_IN_MS BETWEEN 120000 AND 125000 THEN '120000-125000'
    else 'OTHERS'
    END) AS DURATION_IN_MS, 
    COUNT(*) AS cnt
from tab1
GROUP BY DURATION_IN_MS


my output is like this: 


[enter image description here][1]

however, for the range 115000-120000 i wanted to  show the count of 8
for the range 120000-125000 i wanted to  show the count of 6

Can someone help me ? 

【问题讨论】:

  • TOP 是 SQL Server 语法;您是否正确标记了您的问题。
  • 你真的想要 120000 被算作它之前的范围和之后的范围吗?通常你会制作像'120000-124999'或'120001-125000'这样的范围
  • select @@version; 显示什么?
  • 欢迎来到 SO。感谢您尝试提出问题。您描述的列与计数的描述不符。也请不要包括图片,文字要好得多。

标签: mysql count mariadb range


【解决方案1】:

参考:fiddle

SELECT
  case 
      when DURATION_IN_MS BETWEEN 115000 AND 120000 THEN '115000-120000'
      when DURATION_IN_MS BETWEEN 120001 AND 125000 THEN '120001-125000'
      else 'OTHERS'
  END AS grp, 
  COUNT(*) AS cnt
from tab1
GROUP BY grp

就像 ysth 在 cmets 中所说的那样,将范围分开。

案例声明将类别定义为grp,我们GROUP BY这个和count(*)是每个组的数量。

【讨论】:

  • 我猜他们想要计算范围,而不是使用硬编码范围。他们可能还需要没有记录的范围的结果行。但在我确定这是 sql server 或 mysql 8 或 mysql pre-8 或 mariadb 之前,我什至不打算尝试获得任何答案。
  • 同意。这个回答太抢先了,我写这篇文章的时候甚至没有注意到图片 url。
  • 您好,首先感谢您的解答。它在 sql server 上,我不想肯定地使用硬代码范围。但是,我不知道该怎么做。选择案例是我目前想到的唯一解决方案。当我尝试将其分组为 danblack 提到的时,我收到一条错误消息,指出 grp 是无效的列名。
  • 如果你用 mysql 标记一个答案,你会得到一个 mysql 答案。适当标记并在问题中提供足够的信息,以便充分验证答案。
【解决方案2】:

看看你是否喜欢这种技术:

SELECT
    FLOOR(DURATION_IN_MS / 5000)     * 5000     AS 'bucket start',
    FLOOR(DURATION_IN_MS / 5000 + 1) * 5000 - 1 AS 'bucket end',
    COUNT(*) AS cnt
FROM MACHINE_PROCESSING_DURATION_EVALUATION
WHERE ...
GROUP BY 1, 2
ORDER BY cnt DESC
LIMIT 30;

它与您的问题不完全匹配,但更灵活,因为它会自动创建所有必要的范围。 (不需要WITH。)

要获得“其他”,我可能会 UNION 使用另一个反转它的查询。 (这更混乱。)

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多