2016-08-01 9 views
0

Моя таблица (номер телефона, уд./Мин., Временная метка). Я хочу получить номер телефона avg (bpm) для последних 10 строк для каждого номера телефона. Я пробовал ..mysql query, чтобы получить среднее значение из последних N строк для различных номеров телефона.

SELECT phone_number, AVG(bpm) 
FROM (
SELECT * 
FROM table_name 
WHERE bpm !=0 
ORDER BY timestamp DESC 
) AS temp 
GROUP BY phone_number 
HAVING COUNT(*) <=10 

Этот запрос дает пустой результат. Я не могу использовать предложение IN в моей версии mysql.

+0

'Я не могу использовать предложение IN в моей версии mysql.' Пожалуйста, уточните. – Strawberry

+0

Я использую mysql 5.5 и получаю эту ошибку при использовании предложения IN в моих запросах. –

ответ

2

Это боль в MySQL. Наиболее разумное решение использует переменные для перечисления строк и затем агрегации:

SELECT phone_number, AVG(bpm) 
FROM (SELECT t.*, 
      (@rn := if(@pn = phone_number, @rn + 1, 
         if(@pn := phone_number, 1, 1) 
         ) 
      ) as rn 
     FROM table_name t CROSS JOIN 
      (SELECT @pn := '', @rn := 0) params 
     WHERE bpm <> 0 
     ORDER BY phone_number, timestamp DESC 
    ) t 
WHERE rn <= 10 
GROUP BY phone_number; 
+0

Это прекрасно работает. Я не понимаю этих частей, '(@rn: = если (@pn = phone_number, @rn + 1, если (@pn: = phone_number, 1, 1) ) )' ' и ВЫБРАТЬ @pn : = '', @rn: = 0' Не могли бы вы объяснить? –

+1

@HarishVishwakarma. , , Посмотрите на пользовательские переменные в документации MySQL. Это пользовательские переменные, которые реализуют эквивалент стандартной функции 'row_number()' ANSI. –

 Смежные вопросы

  • Нет связанных вопросов^_^