Mysql: выберите значение, которое изменилось по сравнению с его предыдущим (grouped_by) значением - PullRequest
0 голосов
/ 26 марта 2020

Я хотел бы расширить вопрос, который я задал здесь: MySQL: Выбор строк с самой высокой группой по количеству

, на этот вопрос получен отличный ответ, но, оказывается, я Хотелось бы расширить функциональность запроса, но пока безуспешно.

Мои данные все еще выглядят так, сгруппированные по значениям датчика. я просил, чтобы каждый день был самый высокий счет, который, как я сказал, был решен в другом q.

    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

И с этим запросом я получаю идеальный результат:

 WITH cte AS 
( SELECT DATE(date_time) as 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 as a WHERE rnk=1

результат :

2020-03-20  32.56  
2020-03-21  32.54 *
2020-03-22  32.54
2020-03-23  31.92 *
2020-03-24  31.92
2020-03-25  31.92
2020-03-26  31.28 *

Теперь я хотел бы, чтобы результат показывал только те строки, в которые я поставил звездочку. Строки, которые изменились по сравнению с предыдущим. Я могу справиться с этим в PHP, но было бы более эффективно получить его непосредственно из результата запроса. Будет ли это возможно? Я знаю, как выбирать изменения в данных результатов, но не тогда, когда они группируются следующим образом.

заранее спасибо.

1 Ответ

0 голосов
/ 26 марта 2020
WITH 
cte1 AS ( SELECT DATE(date_time) as date_time, 
                 sensor1, 
                 RANK() OVER (PARTITION BY DATE(date_time) ORDER BY COUNT(*) DESC) rnk 
          FROM `weigh_data` 
          GROUP BY DATE(date_time), sensor1 ),
cte2 AS ( SELECT date_time, 
                 sensor1, 
                 LAG(sensor1) OVER (ORDER BY date_time) sensor2
          FROM cte1 
          WHERE rnk = 1 )
SELECT date_time, 
       sensor1
FROM cte2
WHERE sensor1 != sensor2 
   OR sensor2 IS NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...