MySQL Query для получения только одной записи за интервал из базы данных - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть таблица с этой структурой и некоторыми примерами значений:

ID | created | value | person
1  |  1      |   5   | 1
2  |  2      |   2   | 2
3  |  3      |   3   | 3
4  |  4      |   5   | 1
5  |  5      |   1   | 2
6  |  6      |   32  | 3
7  |  7      |   9   | 1
8  |  8      |   34  | 2
10 |  9      |   25  | 3
11 |  11     |   53  | 1
12 |  12     |   52  | 2
13 |  13     |   15  | 3
... etc

Созданный столбец будет иметь метки времени.Т.е. номер типа "1555073978".Я просто сделал это постепенно, чтобы продемонстрировать, что временные метки редко будут одинаковыми.

Таким образом, значения хранятся на человека со временем создания.Значения добавляются каждую минуту.Через неделю этот стол довольно большой.Поэтому, когда я делаю запрос для построения графика, PHP не хватает памяти, потому что набор данных очень большой.

Итак, то, что я ищу, - это простой способ сделать запрос к такой таблице,так что я получаю значения в меньших интервалах.

Как бы я запросил эту таблицу, чтобы я получил: - только одно значение на человека за интервал - где интервал должен быть 15 минут, 30 минут, 60 минут и т. Д. (Т. Е. Параметр в запросе)

Я начал с подхода, но не хочу тратить слишком много времени на случай, если пропущу гораздо более простой способ.Мой способ заключается в преобразовании метки времени в ГОД-МЕСЯЦ-ДЕНЬ-ЧАС, но это будет работать только по часам.Я также изо всех сил стараюсь убедиться, что запрос возвращает САМОЕ ПОСЛЕДНУЮ запись на ЛИЦА за этот час.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 12 апреля 2019

при условии, что созданный вами столбец является временной меткой, и вы хотите, чтобы максимальное значение для человека каждые 15 минут вы могли бы попробовать

select  person, max(value)
from my_table 
group by person, FLOOR(UNIX_TIMESTAMP(created )/(15 * 60))

, но если вам не требуется unix_timestamp

, тогда

group by person, FLOOR(created /(15 * 60)) 

Если вы хотите самые последние значения для человека и интервала, тогда вы можете использовать

select  * from my_table m 
inner join  (
  select  person, max(created) max_created 
  from my_table 
  group by person, FLOOR(UNIX_TIMESTAMP(created )/(15 * 60))
) t on t.person = m.person and t.max_created  = m.created 
...