Нахождение времени отклика, сгруппированного по интервалам - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть таблица, где у меня есть определенные журналы и время их ответа. Я могу запросить таблицу, чтобы получить среднее время ответа за последние 1000 записей, выполнив:

SELECT timestamp, count(*), avg(response_time) FROM table ORDER BY timestamp DESC LIMIT 1000

-- timestamp            count(*)      avg(response_time)
-- 2020-03-17 11:58:37  1000          0.27

Однако я хотел бы получить это за последние N записей на тысячу записей (чтобы увидеть прогресс время отклика с течением времени, кусками по 1000 запросов), то есть что-то вроде:

SELECT timestamp, count(*), avg(response_time) FROM table ORDER BY timestamp DESC LIMIT 1000
  UNION
SELECT timestamp, count(*), avg(response_time) FROM table ORDER BY timestamp DESC LIMIT 1000, 1000
  UNION ...

-- timestamp            count(*)      avg(response_time)
-- 2020-03-17 11:58:37  1000          0.27
-- 2020-03-17 11:38:09  1000          0.52
-- 2020-03-17 11:04:11  1000          1.04
-- and keep going, in groups of 1000 records...

Был бы более чистый способ сделать это, где я мог бы сгруппировать вещи по кусочкам по 1000?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Похоже, вы хотите:

SELECT count(*) no_records, avg(response_time) avg_response_time
FROM table 
WHERE timestamp >= now() - interval 1 day

Если вы хотите это почасово:

SELECT 
    date_format(timestamp, '%Y-%m-%d %h:00:00') hr, 
    count(*) no_records, 
    avg(response_time) avg_response_time
FROM table 
WHERE timestamp >= now() - interval 1 day
GROUP BY date_format(timestamp, '%Y-%m-%d %h:00:00)
ORDER BY hr

Или если вы хотите сгруппировать по кускам по 1000 записей, то (при условии MySQL 8.0), вы можете использовать row_number():

SELECT 
    min(timestamp) first_timestamp,
    last(timestamp) first_timestamp,
    count(*) no_records, 
    avg(response_time) avg_response_time
FROM table 
WHERE timestamp >= now() - interval 1 day
GROUP BY floor((row_number() over(order by timestamp) - 1) / 1000)
ORDER BY first_timestamp
0 голосов
/ 26 апреля 2020

Вы можете делать что хотите, используя оконные функции. Но, увы, вы не можете в MySQL 5.7. Вместо этого используйте переменные:

SELECT MIN(timestamp), MAX(timestamp), count(*), avg(response_time)
FROM (SELECT t.*, (@rn := @rn + 1) as seqnum
      FROM (SELECT t.* FROM table  ORDER BY timestamp) t
           (SELECT @rn := 0) params
     ) t
GROUP BY floor( (seqnum - 1) / 1000 )
ORDER BY MIN(timestamp);
...