За последние 24 часа нас посетил 20331 программист и 1194 робота. Сейчас ищут 788 программистов ...

Сгруппировать по N записей с конца

Тема в разделе "MySQL", создана пользователем NightmareZ, 14 дек 2017.

Метки:
  1. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
    Есть скрипт, который вызывается раз в минуту, собирает статистику с бирж и кладёт её в БД (MySQL).
    Нужно сделать выборку средних значений в каждый час от текущего момента. То есть, взять последние 60 записей и посчитать срднее от них, взять предпосление 60 записей и т.д. Как правильно сделать такую группировку по количеству да ещё и с конца?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Функциями работы с датой в самой СУБД - взять предыдущий час. Функциями агрегациив самой СУБД - взять среднее значение. Функциями группировкив самой СУБД - взять прошлый час, позапрошлый, позапозапрошлый и так далее сколько хочешь. Условными операторами в самой СУБД - ограничить результат выборки. А пых просто итерирует готовые значения.
     
  3. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Код (Text):
    1. create table test (vdate timestamp,rate int);
    2. insert into test (vdate,rate) values ('2017-12-01 10:00:00',10);
    3. insert into test (vdate,rate) values (NOW(),10);
    4. select sum(rate) from test where vdate >= NOW() - INTERVAL 24 HOUR;
     
  4. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
    Собственно, в этом и вопрос был, как функциями SQL сгруппировать записи по 60 штук, начиная с конца?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.592
    Симпатии:
    360
    @NightmareZ, есть ли поле с датой в записи, или только на количества ориентируетесь? И что делать с текущим часом... который ещё не прошел?
     
  6. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
    Есть поле stamp типа TIMESTAMP в который записывается NOW() при вставке. Не сильно важно, что делать с последним незавершённым часом. Можно взять просто последние 60 записей, можно сделать GROUP BY по HOUR(`stamp`) или как-то так.
    --- Добавлено ---
    Вобщем, спасибо, что нифига не помогли. Я сделал так.

    Код (Text):
    1. SELECT AVG(`BTC`), AVG(`LTC`), AVG(`XRP`), AVG(`BCH`), AVG(`ETH`) FROM
    2. ((SELECT * FROM `coins` WHERE `stamp` > DATE_SUB(NOW(), INTERVAL 1 DAY)) AS t)
    3. GROUP BY HOUR(`stamp`);
     
  7. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Для графика ты мог вычислять среднее прямо в графике. Не знаю как ты сделал в SQL, я бы сделал вычисляемое значение "час", вычисляемое из поля времени и группировал по нему. Типа
    Код (Text):
    1. SELECT (CONCAT(SUBSTR(time, 1, 13), ':00:00')) AS hour, avg(rate) AS rate
    2. FROM data
    3. GROUP BY 1
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    оффтоп:
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]
    и
    [​IMG]
    Твой проект не удался:D Уже сам же начал банить.
     
  10. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
    Это точно.
     
  11. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Там вообще забавная тема, я даже pdf`ку вечером под кофе прочитал )
     
  12. NightmareZ

    NightmareZ Активный пользователь

    С нами с:
    1 мар 2012
    Сообщения:
    62
    Симпатии:
    1
    Не зря человек старался :)