【问题标题】:MySQL : Selecting the rows with the highest group by countMySQL:按计数选择具有最高组的行
【发布时间】:2020-03-22 10:44:42
【问题描述】:

我有一个表,其中每分钟更新一次十进制值 (10,2) 的记录。为了忽略测量错误,我想要插入最多的数字。 为此我尝试了:

SELECT date_time,max(sensor1),count(ID)
FROM `weigh_data
group by day(date_time),sensor1

这样我得到记录数

Datetime              sensor1    count(ID)
2020-03-19 11:49:12   33.22      3
2020-03-19 11:37:47   33.36      10
2020-03-20 07:32:02   32.54      489
2020-03-20 00:00:43   32.56      891
2020-03-20 14:20:51   32.67      5
2020-03-21 07:54:16   32.50      1
2020-03-21 00:00:58   32.54      1373
2020-03-21 01:15:16   32.56      9
2020-03-22 08:35:12   32.52      2
2020-03-22 00:00:40   32.54      575
2020-03-22 06:50:54   32.58      1

我真正想要的是每一天计数(ID)最高的一行

谁能帮我解决这个问题?

【问题讨论】:

  • 什么版本的mysql
  • 它在 8.0 版本上运行。

标签: mysql group-by


【解决方案1】:

对于较新的 MySQL(8.0 和更高版本),您可以使用 RANK 窗口函数根据计数对行进行排名。

请注意,这将返回所有“关系”,这意味着如果有 100 个 X 读数和 100 个 Y 读数(并且 100 是最大值),则 X 和 Y 都将返回。

WITH cte AS (
  SELECT 
    DATE(date_time), sensor1,
    RANK() OVER (PARTITION BY DATE(date_time) ORDER BY COUNT(*) DESC) rnk
  FROM `weigh_data` GROUP BY DATE(date_time), sensor1
)
SELECT * FROM cte WHERE rnk=1

如果您只想选择一个(非确定性的)关系,您可以使用ROW_NUMBER 代替RANK

A DBfiddle to test with.

【讨论】:

  • 此解决方案完美无瑕且快速运行。谢谢!!
【解决方案2】:

这是一个基于相关子查询的解决方案,适用于所有版本的 MySQL:

select w.*
from weigh_data w
where w.datetime = (
    select w1.datetime 
    from weigh_data w1
    where w1.datetime >= date(w.datetime) and w1.datetime < date(w.datetime) + interval 1 day
    order by sensor1 desc
    limit 1
)

就像使用rank() 的窗口函数解决方案一样,这允许顶部关系。

为了提高性能,您需要在(datetime, sensor1) 上建立索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2016-03-18
    相关资源
    最近更新 更多