MySQL: выбор строк с наибольшей группой по количеству - PullRequest
0 голосов
/ 22 марта 2020

У меня есть таблица с записями, которые обновляются каждую минуту с десятичным значением (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)

Кто-нибудь может мне помочь в этом?

Ответы [ 2 ]

1 голос
/ 22 марта 2020

В более новых 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

Если вы просто хотите выбрать одну (не детерминированную c) из связей, вы можете вместо этого использовать ROW_NUMBER вместо RANK

DBfiddle для тестирования.

0 голосов
/ 22 марта 2020

Вот решение, основанное на коррелированном подзапросе, которое работает во всех версиях 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...