Forum » Programiranje » [MariaDB] Izpis zadnje spremembe (cene)
[MariaDB] Izpis zadnje spremembe (cene)
HotBurek ::
Dobro jutro.
Evo, nov topel dan, nov izziv.
Imam dve tabeli, produkti in cene. V tabeli cene so podatki:
Zanima me, kako bi izpisal samo zadnjo spremembo?
Osnovni SQL, ki ga uporabljam, je opisan tule: [MariaDB] SQL WHERE challange: Izpis sprememb cen, vključno z zadnjim vnosom?
Poizkusil sem naredit sledeče:
Ampak na output-u dobim tri izpise:
Rad pa bi samo tazadnjega. In še nisem pogruntal, kaj in kako to rešit?
Evo, nov topel dan, nov izziv.
Imam dve tabeli, produkti in cene. V tabeli cene so podatki:
datetime_insert |price| -----------------------+-----+ 2023-03-23 11:26:23.000| 6.49| 2023-03-25 15:29:12.000| 6.49| 2023-03-26 14:51:48.000| 6.49| 2023-03-27 16:48:14.000| 6.49| 2023-03-29 13:02:06.000| 6.49| 2023-03-30 11:40:49.000| 4.99| 2023-03-31 09:58:54.000| 4.99| 2023-04-01 13:49:25.000| 4.99| 2023-04-02 12:39:27.000| 6.49| -- this 2023-04-04 16:13:45.000| 5.99| -- and this 2023-04-05 15:19:01.000| 5.99| 2023-04-05 17:34:57.000| 5.99|
Zanima me, kako bi izpisal samo zadnjo spremembo?
Osnovni SQL, ki ga uporabljam, je opisan tule: [MariaDB] SQL WHERE challange: Izpis sprememb cen, vključno z zadnjim vnosom?
Poizkusil sem naredit sledeče:
ROW_NUMBER() OVER (PARTITION BY product.`id`, price.`price` ORDER BY price.`datetime_insert` DESC) AS 'row_number'
Ampak na output-u dobim tri izpise:
+----------+----- |4.99 |6.49 |4.99 |5.99 |5.99 |6.49
Rad pa bi samo tazadnjega. In še nisem pogruntal, kaj in kako to rešit?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
- spremenilo: HotBurek ()
bemfa ::
Rajši dodaj pogoj preden insertaš v bazo, da če se cena ni spremenila, nič ne zapišeš. Pol samo ORDER BY datetime_insert DESC LIMIT 1 za zadnjo ceno in LIMIT 2 za spremembo. Hitrejši queryi pa manj placa bo baza vzela.
mr_chai ::
Rajši dodaj pogoj preden insertaš v bazo, da če se cena ni spremenila, nič ne zapišeš. Pol samo ORDER BY datetime_insert DESC LIMIT 1 za zadnjo ceno in LIMIT 2 za spremembo. Hitrejši queryi pa manj placa bo baza vzela.
This! Meni tudi ni jasno zakaj zapisuje nespremenjene cene. Ampak koga boli...on je itak en tak poseben subjekt tule, se mu res ne splača odgovarjati, ker nobenega dobrega nasveta ne bo sprejel. Ti svetujem, da mu drugič sploh ne odgovarjaš.
HotBurek ::
bemfa, super hvala za nasvet. Dejansko full simpl rešitev.
Pofiksal bom sicer tako, da bom v primeru, da se cena ni spremenila, zgolj updejt-al (last) datetime, tako da bo ta slajdal glede na to, kdaj je bila ta (ista) cena zadnje posodobljena.
Mega gail!
Pofiksal bom sicer tako, da bom v primeru, da se cena ni spremenila, zgolj updejt-al (last) datetime, tako da bo ta slajdal glede na to, kdaj je bila ta (ista) cena zadnje posodobljena.
Mega gail!
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
bemfa ::
Lahko tudi dodaš en datetime atribut, tako da imaš kdaj si prvič zaznal in kdaj si zadnjič zaznal neko ceno.
@mr_chai: Bo poslušal, če bo dobil jasen, argumentiran odgovor, ki ga razume. Odgovori tipa "čisti dizajn fail" so sicer resnični, ampak si z njimi ne more pomagat.
@mr_chai: Bo poslušal, če bo dobil jasen, argumentiran odgovor, ki ga razume. Odgovori tipa "čisti dizajn fail" so sicer resnični, ampak si z njimi ne more pomagat.
HotBurek ::
Zdej, ko si omenil to opcijo, sem začel ramišljat, da bi lahko v tabeli imel podatke zapisane na sledeč način:
Ali pa takole, kot sem sprva razmišljal:
Ne vem pa še, katera varianta je lažja za izpis zadnje spremembe cene (ter celoten izpis vseh sprememb). Zaenkart prva zgleda lažja. Mogoče tudi vnos (stored procedura) ni tako težko napisat.
datetime_start |datetime_end |price| -----------------------+-----------------------+-----+ 2023-03-23 10:00:00.000|2023-03-25 11:00:00.000| 6.49| 2023-03-25 11:00:01.000|2023-03-29 14:00:00.000| 7.49| 2023-03-26 14:00:01.000|2023-04-02 08:00:00.000| 7.29|
Ali pa takole, kot sem sprva razmišljal:
datetime_insert |price| -----------------------+-----+ 2023-03-23 10:00:00.000| 6.49| 2023-03-25 11:00:01.000| 7.49| 2023-03-26 14:00:01.000| 7.29| 2023-04-02 08:00:00.000| 7.29|
Ne vem pa še, katera varianta je lažja za izpis zadnje spremembe cene (ter celoten izpis vseh sprememb). Zaenkart prva zgleda lažja. Mogoče tudi vnos (stored procedura) ni tako težko napisat.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Zgodovina sprememb…
- spremenilo: HotBurek ()
kunigunda ::
Ne prilagajaj podatkov bazi ali pa procesa podatkom.
Ne vem sicer za kaksen proces bos uporabljal podatke, ampak pri cenah se dostikrat rabi zgodovino sprememb, da se lahko gleda za nazaj ipd.
Tko da prva struktura verjetno odpade. Druga struktura je smiselna, vkolikor nisi casovno omejen, koliko hitro rabis priti do zadnje cene in za koliksno kolicino artiklov gre.
Ce je tega veliko, je bolje da razmisljas o dveh tabelah, prva o artiklih z zadnjo ceno, druga pa z zgodovino (ob vsaki spremembi iz artikla das podatke v history, v artikel pa nove cene).
Ne vem sicer za kaksen proces bos uporabljal podatke, ampak pri cenah se dostikrat rabi zgodovino sprememb, da se lahko gleda za nazaj ipd.
Tko da prva struktura verjetno odpade. Druga struktura je smiselna, vkolikor nisi casovno omejen, koliko hitro rabis priti do zadnje cene in za koliksno kolicino artiklov gre.
Ce je tega veliko, je bolje da razmisljas o dveh tabelah, prva o artiklih z zadnjo ceno, druga pa z zgodovino (ob vsaki spremembi iz artikla das podatke v history, v artikel pa nove cene).
HotBurek ::
Dobro jutro.
Evo, sedaj delam na tem, da določene dodatne (pomagalne) podatke spravim v tabelo, kjer so že cene.
Ker bi rad obdržal obstoječe podatke o cenah, bi rad naredil update.
Matra me narediti izpis, kjer bi za vsako skupino cen (ob spremebah) rad izpisal naraščajoč counter.
SQL query, katerega sem sestavil za kasnejši update:
Output je sledeč:
Stolpec i_want_this je tisto, kar bi rad izpisal.
Stolpec row_number_desc je zelo blizu temu, kar bi želel, ampak so števila padajoča.
Stolpec row_number_asc pa ni tisto, kar bi želel, ker za eno isto ceno izpiše več različnih številk.
Tole mora bit easy fix.
Kako naj popravim SQL, da bo izpisal števila, kot je prikazano v zadnjem stolpcu?
Evo, sedaj delam na tem, da določene dodatne (pomagalne) podatke spravim v tabelo, kjer so že cene.
Ker bi rad obdržal obstoječe podatke o cenah, bi rad naredil update.
Matra me narediti izpis, kjer bi za vsako skupino cen (ob spremebah) rad izpisal naraščajoč counter.
SQL query, katerega sem sestavil za kasnejši update:
SELECT `datetime_insert`, `price`, `row_number_x`, `row_number_asc`, `row_number_desc` FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY `row_number_x` ORDER BY `datetime_insert` ASC) - 1 AS 'row_number_asc', ROW_NUMBER() OVER (PARTITION BY `row_number_x` ORDER BY `datetime_insert` DESC) - 1 AS 'row_number_desc' FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY `price` ORDER BY `datetime_insert` ASC) AS 'row_number_x' FROM `price` WHERE `product_id` = '000-000000449' ) AS x ) AS y ORDER BY y.`datetime_insert` ASC;
Output je sledeč:
datetime_insert |price|row_number_x|row_number_asc|row_number_desc|i_want_this| -----------------------+-----+------------+--------------+---------------+----------+| 2023-02-03 04:00:00.000| 0.94| 1| 0| 2| 0| 2023-02-03 06:00:00.000| 0.94| 2| 0| 2| 0| 2023-02-05 18:00:00.000| 0.94| 3| 0| 2| 0| 2023-02-26 13:00:00.000| 0.94| 4| 0| 2| 0| 2023-03-17 18:00:00.000| 1.69| 1| 1| 1| 1| 2023-03-20 12:00:00.000| 1.69| 2| 1| 1| 1| 2023-03-23 10:55:13.000| 1.69| 3| 1| 1| 1| 2023-03-25 14:57:52.000| 1.69| 4| 1| 1| 1| 2023-03-26 14:21:07.000| 1.69| 5| 0| 1| 1| 2023-03-27 16:17:48.000| 1.69| 6| 0| 1| 1| 2023-03-29 12:30:35.000| 1.69| 7| 0| 1| 1| 2023-03-30 11:10:07.000| 1.69| 8| 0| 1| 1| 2023-03-31 09:29:35.000| 0.99| 1| 2| 0| 2| 2023-04-01 13:21:00.000| 0.99| 2| 2| 0| 2| 2023-04-02 12:09:49.000| 0.99| 3| 2| 0| 2| 2023-04-04 15:44:28.000| 0.99| 4| 2| 0| 2| 2023-04-05 14:48:29.000| 0.99| 5| 1| 0| 2| 2023-04-05 17:06:39.000| 0.99| 6| 1| 0| 2| 2023-04-06 11:52:59.000| 0.99| 7| 1| 0| 2| 2023-04-06 21:07:44.000| 0.99| 8| 1| 0| 2| 2023-04-07 13:22:11.000| 0.99| 9| 0| 0| 2|
Stolpec i_want_this je tisto, kar bi rad izpisal.
Stolpec row_number_desc je zelo blizu temu, kar bi želel, ampak so števila padajoča.
Stolpec row_number_asc pa ni tisto, kar bi želel, ker za eno isto ceno izpiše več različnih številk.
Tole mora bit easy fix.
Kako naj popravim SQL, da bo izpisal števila, kot je prikazano v zadnjem stolpcu?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
HotBurek ::
Ok, tale projekt sprememb v tabelah sem opustil, in prešel nazaj na delujoče skripte.
Tako da, gremo naprej, novim drugim izzivom naproti.
Tako da, gremo naprej, novim drugim izzivom naproti.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
HotBurek ::
Sem sedaj spremenil, da se vpiše zgolj datum prvega in zadnjega vnosa za posamezno spremembo cene, se pravi tako, kot je tule ( https://slo-tech.com/forum/t814339/p788... ) prikazana prva tabela.
Velikost tabele se je zmanjšala za približno 300x.
Zaenkrat zgleda gut.
Lets continue.
Velikost tabele se je zmanjšala za približno 300x.
Zaenkrat zgleda gut.
Lets continue.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [MariaDB] SQL WHERE challange: Izpis sprememb cen, vključno z zadnjim vnosom?Oddelek: Programiranje | 693 (486) | HotBurek |
» | [MariaDB] Kako napisat SQL za top N by group?Oddelek: Programiranje | 546 (357) | kljuka13 |
» | Kako napisat SQL query?Oddelek: Programiranje | 1352 (558) | HotBurek |
» | Dela prosti dnevi do 2030Oddelek: Programiranje | 4565 (3419) | GupeM |
» | Pridobitev podatkov in sortiranjeOddelek: Programiranje | 946 (767) | Spura |