SQL dotaz – fetchPairs s posloupností

Newer
Člen | 47
+
0
-

Ahoj, mám takový složitejší sql dotaz , kde se grupuje po dnech a počítá se vážený průměr......

výsledek je indexované pole, kde klíč je datum, a hodnota je výpočet…

a potřeboval bych SQL dotaz, kdy hodnota bude připočítávat i minulé dny…

tzn tabulka např:
datum – hodnota
1.1.2020 – 2
1.2.2020 – 4
1.3.2020 – 1
1.4.2020 – –5

a výsledek bych si představoval…
1.1.2020 – 2
1.2.2020 – 6
1.3.2020 – 7
1.4.2020 – 2

vždy jde tedy o sumu všecg předchozích dat k aktuálnímu, stačí mne nakopnout, pak si to sestavím a aplikuji na svůj SQL dotaz.

Děkuju moc:-)

Editoval Newer (30. 6. 2020 12:44)

David Matějka
Moderator | 6445
+
+1
-

ahoj, hledej na google „running total“. záleží, co máš za databázi, respektive jestli podporuje window funkce – postgresql, mssql server a mysql od verze 8. pokud máš starší mysql, tak se to řeší pomocnou proměnnou, viz jeden příklad ze stackoverflow:

SET @runtot:=0;
SELECT
   q1.d,
   q1.c,
   (@runtot := @runtot + q1.c) AS rt
FROM
   (SELECT
       DAYOFYEAR(`date`) AS d,
       COUNT(*) AS c
    FROM  `orders`
    WHERE  `hasPaid` > 0
    GROUP  BY d
    ORDER  BY d) AS q1
Newer
Člen | 47
+
0
-

Ahoj, super, dekuju za radu. Ja ani nevedel jak to spravne vygooglit. Server bezi na 10.1.37-MariaDB – Source distribution
Verze protokolu: 10 , takze by to asi melo podporovat ty window funkce…

kazdopadne takovehle nakopnuti mi uplne staci. jeste jednou dik

David Matějka
Moderator | 6445
+
+1
-

v mariadb jsou window funkce podporovane od 10.2

Newer
Člen | 47
+
0
-

tak se sem musím obrátit ještě jednou protože mi všechny možné kombinace vyhazují PDOException #HY000, zkousel jsem to bez formatovani data, s fetchAll(); na konci bez fetchAll – tam je nejaka specialni chyba :-)) ..... ale proste se pres tu HY000 nedostanu.

<?php
        return $this->database->query('SET @rununit:=0;
                                            SELECT
                                               DATE_FORMAT(added,?) AS `dateFormat`,
                                               `result`,
                                               `user_id`,
                                               (@rununit := @rununit + `units`) AS `unitsTotal`
                                            FROM  `bets`
                                            WHERE NOT `result` = ?
                                            WHERE `user_id` = ?
                                            GROUP BY `dateFormat`', '%Y-%m-%d', '0', $tiper)->fetchPairs('dateFormat', 'unitsTotal');


?>
David Matějka
Moderator | 6445
+
+1
-

zkus to rozdelit na dva dotazy, tedy set a select do samostatneho volani query.

Newer
Člen | 47
+
0
-

mhmm, perfektní… Opět jsi mne navedl správně, díky tomu jsem odhalil i další chyby v SQL syntaxi… Děkuji ti.

<?php
$this->database->query('SET @rununit:=?', '0');
        return $this->database->query('SELECT
                                        DATE_FORMAT(added,?) AS `dateFormat`,
                                        `result`,
                                        `user_id`,
                                        (@rununit := @rununit + `units`) AS `unitsTotal`
                                        FROM `bets`
                                        WHERE NOT `result`=?
                                        AND `user_id`=?
                                        GROUP BY `dateFormat`','%Y-%m-%d','0',$tiper)->fetchPairs('dateFormat', 'unitsTotal');
?>
Newer
Člen | 47
+
0
-

tak mi to samozrejme pocitalo spatne neprenaselo to soucty group hodnot ale vzdy jen jednu z daneho dne....... je potreba zanorit SELECT do SELECT kde je ten group a tam to brat… njn, on mi to @DavidMatějka psal …

<?php
 $this->database->query('SET @rununit:=?', '0');
        return $this->database->query('SELECT dt.*,
                                       round((@rununit :=  + @rununit + dt.totalunits),?) AS `unitsTotal`
                                       FROM (
                                            SELECT t1.*,
                                            DATE_FORMAT(t1.added,?) AS `dateFormat`,
                                                sum(t1.units) AS `totalunits`
                                            FROM `bets` AS `t1`
                                            WHERE `result`<>?
                                            AND `user_id`=?
                                            GROUP BY `dateFormat`) AS `dt`
                                        CROSS JOIN (SELECT @running_total := 0) AS t2 ', '3', '%Y-%m-%d', '0', $tiper)->fetchPairs('dateFormat', 'unitsTotal');
    }

?>

Editoval Newer (2. 7. 2020 11:16)