Autor Zpráva
sysel
Profil
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}';
Ovšem v databázi si s tím opravdu nevím rady. Sand pomocí proměnné?
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
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
Chceš sečíst jen čísla v některých záznamech? Přidej podmínku, například:
SELECT SUM(sloupec) AS soucet FROM tabulka WHERE validni = 1 AND publikovano < NOW()
sysel
Profil
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
získat:
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)
matematicky by se to dalo popsat jako numerická integrace.
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
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 ;
Trochu mi není jasný JOIN ? Ale zkusím to.
Kajman:
SUM() OVER (PARTITION BY   )
se mi líbí, ale příklady mi nejsou moc jasné, hlavně jak udělat okno (od 1 do teď).
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0