Я пытаюсь полностью перенести некоторую статистическую логику в 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 и т. Д. Со значениями внизу.
Любая помощь будет принята с благодарностью!