Тема: MYSQL Як правильно робити графік

В таблиці є СУМА та ДАТА, потрібно зробити по ними графік з точністю до 100 точок.
Наприклад: База даних має 50`000 записів, якщо їх всіх вибрати, це буде довго, та й графік з такою точністю в даному випадку не потрібний. Як зробити так, щоб отримати графік з точністю до 100 точок ?

В мене є ідея, але хочеться почути ще якісь варіанти

Ідея така:
Щоб спростити опис прикладу, змінимо умову: точність до чотирьох точок

  • Створити додаткову таблицю з чотирма рядками, стовпці СУМА, ДАТА, КІЛЬКІСТЬ

  • Два перших рядка для найстаріших даних, в який буде записуватися середнє арифметичне від всіх чотирьох рядків, при досягненні умови рівності всіх чотирьох рядків по стовпчику сума

  • І два останніх рядка в який буде записуватися середнє арифметичне від нових даних

І так дальше

КІЛЬКІСТЬ стовпець буде виглядати так
Рядок №1 №2 №3 №4   
1) 1 1 1 1
2) 2 = 1+1, 2 = 1+1, 1 0
3) 2 2 1 1
4) 2 2 2 = 1+1, 1
5) 4 4 1 0

2 Востаннє редагувалося Q-bart (27.04.2020 14:30:59)

Re: MYSQL Як правильно робити графік

Розглядав колись статистику треба було рахувати:
1. Табличку не треба. Легше буде view або materialized view;
2. Запит формується з використанням date trunc функцій (в постгрес, в mysql є щось аналогічне) - це якщо треба одне число за один день, а бо одне число на місяць напр.

Подякували: Betterthanyou, leofun012

3

Re: MYSQL Як правильно робити графік

Не дуже зрозумів умову, проте - якщо чіткого ліміту не буде (рівно 100 рядків), а записів в один день багато, то можна просто групувати по даті і вираховувати середнє. Це однозначно зменшить отриману кількість записів, в результаті будемо мати і суму, і дату. Також можна і по тижнях, місяцях і тд. групувати + можливо там потрібен графік за конкретний період.

Якщо ж головна задача вираховувати середню суму через N рядків, то можна спробувати щось типу цього:

SET @i := 0;
SELECT
    AVG( `СУМА`) 
FROM
    (
    SELECT
        @i := @i + 1 AS `number`,
        FLOOR( @i / {N} ) AS `group_id`,
        money AS `СУМА`,
        some_date AS `ДАТА` 
    FROM
        my_table 
    ORDER BY
        some_date ASC 
    ) AS tab1 
GROUP BY
    group_id;
Подякували: Betterthanyou, 0xDADA11C7, leofun013