Я пытаюсь полностью перенести некоторую статистическую логику на SQL, чтобы значительно улучшить производительность, однако это довольно сложно, и я не уверен, как добиться этого с помощью процедур / функций в SQL - или возможно ли это вообще.
Таблица статистики выглядит так:
Строка в таблице выглядит так:
Это код, который я пытаюсь преобразовать. $this->stats - это красноречивый набор всех строк в таблице:
return $this->stats
->groupBy(function ($stat) {
return $stat->created_at->format('Y-m-d');
})
->map(function ($stats) {
$times = [];
for ($hour = 0; $hour < 24; $hour++) {
$thisHour = $stats->filter(function ($stat) use ($hour) {
return (int) $stat->created_at->format('H') === $hour;
});
$times[$hour] = $thisHour->isNotEmpty()
? $thisHour->sum(function ($stat) {
return $stat->data->count;
}) : 0;
}
return $times;
});
Это выводит что-то вроде этого:
{
"2018-12-20": {
0: 54,
1: 87,
2: 18,
3: 44,
4: 35,
...
}
}
Таким образом, он сгруппирован по дате, и каждая дата содержит 0-23 (часы дня) с соответствующим значением (в данном случае суммирование свойства строки data-> count).
В другом запросе я смог получить суммирование свойства data-> count, используя следующее:
SELECT SUM(data->>\"$.count\") AS value
Так возможно ли это вообще сделать в SQL? Я представляю, что там есть столбцы даты, плюс столбец часов, поэтому hour_0, hour_1 и т. д. Со значениями под ними.
Любая помощь будет принята с благодарностью!
Это не запрос к базе данных, а коллекция Laravel с некоторыми функциями. Откуда берется $this->stats?
Обновленный пост - $this->stats - это красноречивый сборник всех строк в таблице
Добавлены изображения стола






Первый шаг, который я хотел бы сделать, чтобы понять, как это делает Laravel, - это включить ведение журнала запросов и сбросить запрос;
DB::connection()->enableQueryLog();
// ... do your query
$queries = DB::getQueryLog();
Это позволит вам воссоздать запрос Eloquent на простом SQL. Оттуда вы можете работать над оптимизацией и конденсацией.
https://laravel.com/docs/5.0/database#query-logging
Извините, возможно, я не совсем понял - код, который я поместил выше, взят из Laravel Collections, поэтому $this->stats - это всего лишь все строки в таблице.
ПЕРЕДАЧА
Поскольку вы теперь включили структуру таблицы, следующий запрос должен дать вам требуемые результаты в табличном формате. Вам нужно проанализировать результаты, чтобы преобразовать их в json.
Обновленный SQL
SELECT DATE_FORMAT(stats.updated_at, "%Y-%m-%d") AS `date`,
HOUR(stats.updated_at) AS `hour`,
COUNT(stats.id) AS record_count
FROM stats
GROUP BY `date`, `hour`
ORDER BY 1 ASC, 2 ASC
Полученные табличные данные будут выглядеть примерно так.
Я обновил ответ, чтобы он соответствовал структуре таблицы.
Как выглядит стол?