SQL – Efektivní dotaz na výběr statických dat podle dnu / měsíce / roku

Dan Hundrt
Člen | 74
+
0
-

Zdravím,

rád bych se zeptal, zdali lze vůbec efektivně vybrat data z tabulky, která vypadá takto:

https://i.ibb.co/…20-27-56.png

Řeším výběr dat – potřeboval bych vytáhnout efektivně data od – do podle sloupce day, month, year podle uživatele s tím, že by na výstupu byl SUM(sum_basket) a SUM(page_view) vždy po dnech.

Aktuálně je logika udělaná tak, že se ve for cyklu proiterují záznamy od – do a v každé iteraci se vypočítám SUM, což vzhledem k počtu řádků v DB je poměrně náročné (co iterace to SQL dotaz).

Nevíte, zda to lze řešit návrh efektivněji?

Filtrace od – do může být variabilní, iterovat např. půl roku by výkonově nedávalo smysl.

Děkuji za případnou odpověď

h4kuna
Backer | 740
+
0
-

Na obrázku chybí sloupeček sum_basket, nemělo to být SUM(basket_counter)?

Jen se ujistím. Předpokládejme že id 60 a 87 vícekrát v tabulce nejsou a pokud ty udělám výběr tak pro 1.1.2022 by měl být výsledek SUM(basket_counter) → 4 a SUM(page_view) → 200. Pokud je to tak, tak by to měl být jednoduchý dotaz.

SELECT SUM(basket_counter), SUM(page_view) FROM table
WHERE condition
GROUP BY year, month, day

Tady je otázka na to jak vybrat rozsah? Asi by stačilo nad sloupce year, month a day dát složený index a pak rozepsat podmíny na rozsah datumů nebo… Mysql podporuje generované sloupce a to bych asi udělal. Tj, udělal bych si date sloupec z těch year, month a day. Na tento nový sloupec jde dát index. Tento nový sloupec lehce použiješ ve WHERE a pak se ti i lépe bude převádět na datetime při vývěru. V group by půjde taky použít.

Ale myslím si že by to mělo fungovat i s tím složeným indexem a původními třemi sloupci, jen je s tím trochu více práce, když jsou sloupce takto rozděleny.

Editoval h4kuna (6. 2. 2022 8:51)

Dan Hundrt
Člen | 74
+
0
-

Zdravím,

díky za nakopnutí. Nakonec udělám agregační tabulku, těch dat je poměrně hodně.