Autor | Zpráva | ||
---|---|---|---|
sysel Profil |
#1 · Zasláno: 23. 8. 2018, 21:41:37
Potřebuji sčítat čísla ve sloupci od prvního záznamu do aktuálního. Pokud sloupec vyexportuji do textového souboru, provedu to jednoduchým shellovým skriptem:
awk 'BEGIN{FS=","}{print $1","AA=AA+$1}'; Vím, že se zdá zbytečné hledat jiné řešení, když skript funguje, ale jde o miliony záznamů a exporty a importy jsou docela dlouhé. Děkuji za každý nápad. |
||
juriad Profil |
#2 · Zasláno: 23. 8. 2018, 21:54:19
Co znamená aktuální záznam? Chceš jednoduše sečíst všechna čísla v nějakém sloupci?
SELECT SUM(sloupec) AS soucet FROM tabulka SELECT SUM(sloupec) AS soucet FROM tabulka WHERE validni = 1 AND publikovano < NOW() |
||
sysel Profil |
#3 · Zasláno: 23. 8. 2018, 22:05:53
juriad:
Myslel jsem, že z příkladu skriptu to bude zřejmé. Potřebuji na každé řádce přidat součet aktuální položky se všemi předcházejícími, například z: id,cislo 1,3 2,8 3,5 4,2 5,6 id,cislo,soucet 1,3,3 2,8,11 (3+8) 3,5,16 (3+8+5) 4,2,18 (3+8+5+2) 5,6,24 (3+8+5+2+6) |
||
Kajman Profil |
Pokud databáze podporuje window funkce, tak to lze jednoduše.
select id, cislo, sum(cislo) over(order by id) soucet from tabulka order by id |
||
sysel Profil |
#5 · Zasláno: 23. 8. 2018, 23:01:53
Našel jsem toto:
SELECT t.id, t.count, @running_total := @running_total + t.count AS cumulative_sum FROM TABLE AS t JOIN (SELECT @running_total := 0) AS r ORDER BY t.id ; Kajman: SUM() OVER (PARTITION BY ) V postgres helpu je k tomu ještě ROWS BETWEEN UNBOUNDED PRECEDING / FOLLOWING asi bude nutno se hlouběji ponořit do manuálů. Hlavně jsem pochopil, že klíčové slovo pro vyhledávač je "running total". Díky |
||
Kajman Profil |
Ten join pro mysql a uživatelské proměnné je jen pro inicializaci proměnné v jednom dotazu. Můžeš ji i nastavit pomocí příkazu set před tím dotazem.
Partition nepotřebuješ, pokud sčítáš postupně vše a nechceš samostatné součty např. ještě na kategorie. Rows between by bylo potřeba, kdyby se sčítalo jen třeba posledních 5 a dalších 5. Pro sčítání od začátku není třeba nic vymýšlet. To sum(cislo) over(order by id) by mělo jít minimálně v postresql, oracle, mysql 8, mariadb 10.2. Možná i v dalších databázích.
|
||
sysel Profil |
#7 · Zasláno: 24. 8. 2018, 09:19:51
Tak jsme to odzkoušeli na ostrých datech. Fungují obě varianty a zdá se, že jsou srovnatelně rychlé.
Přes 2 mil řádek kolem 20s. Tedy podstatně rychlejší než samotný skript (ten trval přes minutu) a s připočtením exportu a zpětného importu to vůbec nelze srovnávat. Řešení [#4] Kajman považuji za čistší, (i když to s proměnnou mi bylo programátorsky srozumitelnější), a je celkem bez problémů přenositelné do jiných SQL dialektů. Děkuji a otázku považuji za velmi dobře zodpovězenou. |
||
Časová prodleva: 5 let
|
0