[ Hans_D @ 27.06.2021. 14:30 ] @
Pozdrav drugari,

Potrebno mi je da iz tabele izracunam ukupan broj upisa od poslednjeg reda do reda koji sadrzi neki podatak u odredjenoj koloni.

Kolona 'gotov' je uvek null osim u izuzetnim slucajevima kada je recimo "D". Kako da napravim upit da izracunam?

Hvala puno
[ nkrgovic @ 27.06.2021. 14:51 ] @
OK, ne garantujem da sam shvatio, ajde da probam:

- Uradis select count(*) from nekatabela - to ti da broj redova
- Uradis select id from nekatabela where nekakolona=stagodzelis order by id - to ti da redni broj reda koji sadrzi stagodzelis u nekakolona koloni.

Pretpostavka je da je id autoincrement primarni kljuc. Ako ti je autoincrement increment veci od 1, podelis sa tim brojem.
[ bogdan.kecman @ 27.06.2021. 14:53 ] @
napisi CREATE TABLE koji ce da kreira tu tabelu koju hoces da propitas i
napisi nekoliko INSERT-a koji ce da napune neku datu u tu tabelu nad
kojom moze da se radi upit i onda napisi kakav bi rezultat zeleo da
dobijes... ovo sto si napisao ovako nema bas puno smisla... za pocetak
"ukupan broj upisa od poslednjeg reda" je uvek nula, ako je red
poslednji posle njega nema nista ... mozda si mislio nesto tipa

SELECT COUNT(*) FROM t1 WHERE id > (SELECT MAX(ID) FROM t1 WHERE kolona
IS NOT NULL);
[ djoka_l @ 27.06.2021. 15:03 ] @
Relacione baze podataka NE GARANTUJU da je redosled redova u tabeli isti kao i redosled po kojima su redovi uneti.
Drugim rečima redosled redova je NEUREĐEN.

Tako da, teorijski gledano, NE POSTOJI poslednji red.
Naravno, SELECT može na neki način da sortira redove, pa da se onda govori o tome koji je poslednji red koji je dao upit koji ima order by klauzulu, inače je besmisleno govoriti o poslednjem redu.

Neke baze imaju mehanizam da beleže metapodatke o redu.
Recimo, Oracle ima SCN (system change number) koji na nivou bloka beleži koja je poslednja transakcija koja je MENJALA podatke u bloku (INSERT, UPDATE, DELETE).
Ovaj podatak može da se forsira i da se čuva na nivou reda, ali on ne kaže da li je red insertovan ili je urađem update.

SQL Server može da čuva u tabeli kolonu tipa rowversion ili timestamp, pa da to bude neki pokazatelj da je red menjan/insertovan.

Ovako, back to the drawing board.
[ bogdan.kecman @ 27.06.2021. 15:05 ] @
@nk nece radi ako je brisao slogove pa ima rupe ili ako ima setup koji
alocira vise id vrednosti pa ne upotrebi sve uvek.. mora count() od tog
sloga na dalje ...
[ Hans_D @ 27.06.2021. 18:06 ] @
Citat:
bogdan.kecman:
napisi CREATE TABLE koji ce da kreira tu tabelu koju hoces da propitas i
napisi nekoliko INSERT-a koji ce da napune neku datu u tu tabelu nad
kojom moze da se radi upit i onda napisi kakav bi rezultat zeleo da
dobijes... ovo sto si napisao ovako nema bas puno smisla... za pocetak
"ukupan broj upisa od poslednjeg reda" je uvek nula, ako je red
poslednji posle njega nema nista ... mozda si mislio nesto tipa

SELECT COUNT(*) FROM t1 WHERE id > (SELECT MAX(ID) FROM t1 WHERE kolona
IS NOT NULL);



Brate evo raspolozen sam da te vodim na rucak ako si iz bg. bravo doktore :)


evo situacije

https://ibb.co/yYrtZyC
[ Doktor Hlad @ 27.06.2021. 18:49 ] @
Citat:
Hans_D:Potrebno mi je da iz tabele izracunam ukupan broj upisa od poslednjeg reda do reda koji sadrzi neki podatak u odredjenoj koloni.


Sve zavisi kako ti je dizajnirana tabela. Uopsteno radice ovako:

Code:

with t as (
    select    vreme
    from    tabela
    where    neka_kolona = @neki_podatak
    order by vreme desc
    limit 1
)
select    count(*) as broj_upisa
from    tabela
where    vreme > (select vreme from t)


Ako imas primarni kljuc koji je auto-increment:

Code:
select    count(*) as broj_upisa
from    tabela
where    primarni_kljuc > (
    select    max(primarni_kljuc)
    from    tabela
    where    neka_kolona = @neki_podatak
)
[ Hans_D @ 27.06.2021. 19:03 ] @
Ovo radi:

SELECT COUNT(*) FROM t1 WHERE id > (SELECT MAX(ID) FROM t1 WHERE kolona
IS NOT NULL);


Hvala!
[ nkrgovic @ 27.06.2021. 19:15 ] @
Citat:
bogdan.kecman:
@nk nece radi ako je brisao slogove pa ima rupe ili ako ima setup koji
alocira vise id vrednosti pa ne upotrebi sve uvek.. mora count() od tog
sloga na dalje ...

Nije mi palo na pamet da je brisao.... :/ Hvala.
[ Hans_D @ 27.06.2021. 19:17 ] @
Nisam brisao nego imam triger koji ne dozvoljava vise upisa u jednoj sekundi a ja ih imam
[ nkrgovic @ 27.06.2021. 19:38 ] @
Meni je, iskreno, delovalo kao zadatak za skolu, pa sam probao da samo dam neki hint na briznu, pre nego sto izadjem napolje. ;)
[ Hans_D @ 27.06.2021. 19:55 ] @
Brate ja sam probao i nesto slicno i sa varijablama i svasta nesto ali nikako da ubodem :) hvala ti jos jednom
[ Doktor Hlad @ 27.06.2021. 23:19 ] @
Citat:
Hans_D:
Nisam brisao nego imam triger koji ne dozvoljava vise upisa u jednoj sekundi a ja ih imam


Prijateljski savet: imas opasan problem sa dizajnom ako ti ovakav trigger treba.
[ bogdan.kecman @ 28.06.2021. 00:16 ] @
@hans, iz bgd-a sam, hvala na ponudi, ali mnogo vruce za klopu :D ... bice uskoro #mdevday (zadnji bio 2019 https://www.mcloud.rs/blog/developers-mday-2019-u-beogradu/ ) gde cu neki klinac pricati o mysql-u pa dodji, popicemo pivo :)

elem, da ti ne filozofiram previse, obrati paznju vrlo dobro na djokin post

Citat:

Relacione baze podataka NE GARANTUJU da je redosled redova u tabeli isti kao i redosled po kojima su redovi uneti. Drugim rečima redosled redova je NEUREĐEN.


mysql je kroz godine rada glumeci pravi sql server naucio usere razne pogresne stvari (pricacu bas o tome na #mdevday u julu) i ljudi su navikli da ocekuju neke stvari koje nisu deo standarda... sa novim mysql-om koji prilicno dobro prati standard to vise nije "ocekivano" tako da moras da obratis paznju na te stvari. U tvoj slucaju, za ovaj primer, koliko vidim treca kolona u ovoj slici je neki datetime (to bi bilo bolje da je neki timestamp al ajde), ako je to vreme koje ti pije vodu onda bi mogao da koristis tu kolonu za order pa onda uradis nesto tipa

Code:

SELECT COUNT(*) FROM t1 WHERE datetimekolona > (SELECT MAX(datetimekolona) FROM t1 WHERE kolona IS NOT NULL);


naravno ocekujes da je `datetimekolona` indexirana :) i da je `kolona` indexirana mada racunaj na penalty ovde posto ako ti je kardinalnost `kolona` tako mala (null i D) mozes da imas perf. penalty tu pa ako se ispostavi da ti je to sporo, a vec koristis trigere, mozda ti je korisnije da imas posebnu tabelu gde ces da cuvas taj datetime za not null vrednost preko nekog trigera (tabela sa samo jednim slogom)

dalje, 5.x nema bas CTE kako treba, ako koristis 8.0 pogledaj malo CTE upit koji ti je pisao dr ladovina (prvi upit koji ti je napisao, drugi je obican, isti kao ovo sto sam ti ja napisao sto ti radi), cisto, ako nisi radio sa CTE vreme je, treba naucis, mysql 8.0 ce uskoro ponuditi i neke optimizacije bolje za CTE nego sto ima sada..

takodje, ovo sto ti je napisao dr ladovina da
Citat:

imas opasan problem sa dizajnom


nemamo saznjanja sta pravis, na cemu radis, koja je istorija projekta i slicno, ali u velikom procentu ovakav zahtev opravdava taj komentar... ako nisi na odrzavanju vec u razvoju, razmisli malo bolje o dizajnu, ako je rec o odrzavanju necega sto odavno radi, onda jbg, svi znamo da budzenje nije dobar pristup ali je nekad sve sto klijent hoce da plati, sa tvoje strane jedino budi siguran da mu objasnis koliki tehnicki dug pravi svakim tim budzenjem i probaj da to dokumentujes negde da ti se ne vrati kao bumerang i pesma :D
[ Hans_D @ 28.06.2021. 20:24 ] @
Evo ovako: Koristim python skriptu koja upisuje u bazu kada se na raspberry pi dogodi triger ( callback interupt ) tako da kada mi dodje struja na gpio pin, okine mi se upis u tabelu (u zavisnosti na koji pin dodje struja, upisuje se odredjeni red).

Problem je sto je raspi osetljiv i kada dodje jedno okidanje, on oseti recimo 10 cimanja i 10 puta mi upise u bazu jedan te isti podatak. Iz tog razloga imam triger koji eliminise ostale upise i dozvoljava samo jedan upis u 4 sekunde sto je dovoljno jer nikad nemam dva upisa u 4 sekunde. Za to koristim unique id i zato mi nisu id-evi u tabeli po redosledu, jer se upisu pa se izbrisu ovi koji su visak :)

Sto se tice kolone sa vremenom, timestamp je..
[ bogdan.kecman @ 28.06.2021. 20:33 ] @
hahahahah uradi debounce tog pina :D

1. mozes da radis software debounce
2. mozes da radis hw debounce

najbolje i jedno i drugo :D



https://faculty-web.msoe.edu/j.../Common/FILES/msp_debounce.pdf
http://www.ganssle.com/debouncing-pt2.htm



https://duckduckgo.com/?t=ffab&q=debounce+pin&ia=web
[ Doktor Hlad @ 28.06.2021. 21:53 ] @
Citat:
Hans_D:
Evo ovako: Koristim python skriptu koja upisuje u bazu kada se na raspberry pi dogodi triger ( callback interupt ) tako da kada mi dodje struja na gpio pin, okine mi se upis u tabelu (u zavisnosti na koji pin dodje struja, upisuje se odredjeni red).

Problem je sto je raspi osetljiv i kada dodje jedno okidanje, on oseti recimo 10 cimanja i 10 puta mi upise u bazu jedan te isti podatak. Iz tog razloga imam triger koji eliminise ostale upise i dozvoljava samo jedan upis u 4 sekunde sto je dovoljno jer nikad nemam dva upisa u 4 sekunde. Za to koristim unique id i zato mi nisu id-evi u tabeli po redosledu, jer se upisu pa se izbrisu ovi koji su visak :)

Sto se tice kolone sa vremenom, timestamp je..


To resis u pajtonu tako sto u promenljivu zapises kada je bio poslednji upis u bazu i prilikom okidanja proveris kada je bio poslednji upis u bazu i ako je pre manje od cetiri sekunde onda ignorises.
[ Hans_D @ 29.06.2021. 12:19 ] @
Sve sam odradio u pajtonu sada ali ostale mi tabele takve.

@kecman koristim iz odredjenih razloga pigpio biblioteku koja nema debounce ;)
[ bogdan.kecman @ 29.06.2021. 12:22 ] @
dobra je to biblioteka, ja sam jedan od kontributora za opi.gpio :D
(isto to samo za orange pi koji je dosta dugo bio mnogo bolji od rpi)
... mozes ti da dodas u samom pitonu layer izmedju biblioteke i tvog
koda koji bi radio debounce, ali dovoljno je da uradis hw debounce i ne
moras da se zezas sa sw uopste
[ Hans_D @ 02.07.2021. 11:39 ] @
Van teme, ima da se kupi optoizolovana plocica 3-24v input, i to radi vrhunski sve dok ne dodjes u situaciju da je nakacis na sklopku koja provlaci 220v, tada dolazi do ludila. Ali evo vidim da se pojavile i za 220v tako da ako neko ima slicnih problema moze da proba

Sto se tice biblioteka pigpio je bolji dosta od RPi.GPIO, jedino sto RPi.GPIO ima debounce da ne moras da pises nista izmedju


https://www.kupujemprodajem.co...?filter_id=1243350474#photoBig