Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 13. 3. 2024, 12:09:08
Potřebuji tohle převést do Window funkce (OVER()).
Těch bucketů (částek) tam bude třeba 10. SQL dotaz by byl dlouhý i když jej lze vygenerovat v PHPku. Zajímá mě, jestli to jde přepsat do WINDOWS funkcí, nepodporují WHERE, co jsem se díval. SELECT 500 AS 'bucket', COUNT(*) cnt, SUM(total_price) `sum` FROM `order` WHERE total_price <= 500 UNION ALL SELECT 1000 AS 'bucket', COUNT(*) cnt, SUM(total_price) `sum` FROM `order` WHERE total_price <= 1000 |
||
Kajman Profil |
#2 · Zasláno: 13. 3. 2024, 12:46:00
Asi by mělo jít něco jako
SELECT bucket, sum(cnt) over(ORDER BY bucket) cnt, sum(`sum`) over(ORDER BY bucket) AS sum FROM ( SELECT vypocet_bucket_dle_price AS bucket, count(*) AS cnt, sum(total_price) AS sum FROM `order` GROUP BY vypocet_bucket_dle_price ) t ORDER BY bucket |
||
Kcko Profil |
Jasně, chápu, vypadá to dobře.
Je to pomalejší než první verze s UNION. Ještě je tu problém, že součastí toho bucket přehledu má být cena "celková", tj. neomezená hranicí. Takže takhle SELECT bucket, sum(cnt) over(ORDER BY bucket) cnt, sum(`sum`) over(ORDER BY bucket) AS sum FROM ( SELECT CASE WHEN (total_price <= 500) THEN 500 WHEN (total_price <= 1000) THEN 1000 WHEN (total_price <= 2000) THEN 2000 WHEN (total_price > -1) THEN 'XXX' END AS bucket, count(*) AS cnt, sum(total_price) AS sum FROM `order` GROUP BY bucket ) t ORDER BY bucket |
||
Kajman Profil |
#4 · Zasláno: 13. 3. 2024, 15:42:22
Ještě si můžeš vygenerovat z php jen hranice těch bucketů. A nad tím seznamem hranic udělat 2 korelované dotazy na count a sum pro každou z hranic.
|
||
Kcko Profil |
Kajman:
Takhle? SELECT bucket, (SELECT COUNT(*) FROM `order` WHERE total_price <= tmp.bucket) cnt, (SELECT SUM(total_price) FROM `order` WHERE total_price <= tmp.bucket) total FROM ( SELECT 500 bucket UNION SELECT 1000 UNION SELECT 2000 ) tmp GROUP BY tmp.bucket Nejrychlejší je pořád UNION verze. |
||
Časová prodleva: 1 rok
|
0