Pomoc s SQL pre selekciu timestamp

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Bebeno 29. 11. 2020 15:25

Zdravím všetkých.

Chcel by som Vás poprosiť o radu, nasmerovanie.
Mám v databáze tabulku kam sa mi zapisujú údaje prijaté z monitorovacieho zariadenia.
Každú minutu sa v tabulke vytvorí nový záznam ak je zariadenie online, ak je offline tak sa nič nedeje.
V tabulke mám stlpec s dátumom a casom kedy dáta prišli typu TIMESTAMP.

Potrebujem z tejto tabulky získať obydva riadky kde rozdiel casu medi dvomi po sebe nasledujúcimi riadkami je viacej ako 15 minút.

Je to nejakou cestou možné urobiť?

Ďakujem
Bebeno
Kolemjdoucí

Odeslat příspěvekod JanFiala 29. 11. 2020 20:17

Je to možné udělat, jen by bylo vhodné, kdybys tam měl referenci na předchozí řádek, což asi nemáš.

teď můžeš udělat něco jako:
Select t1.*, cas2 = (select top t2.cas from tabulka t2 where t2.cas < t1.cas order by t2.cas desc)
from tabulka t1
having DateDiff(mm, t1.cas, cas2) > 15
order by t1.cas

Nepises pro jaky SQL server je to urcene, tak si to uprav.
Pomoci subselectu ziskas prvni nizsi cas z te same tabulky a pomoci having odfiltrujes vse, co je pod 15 minut.
Ve vysledku bys mel mit zaznamy, ktere maji vic jak 15 minut proti predchozimu zaznamu.
Doporucuji mit na sloupci s casem index.

Pokud bys tam mel nejake pocitadlo, treba identity a nepromazaval zaznamy, pak bys mohl tu samou tabulku napojit pres join rovnou a bylo by to mnohem rychlejsi. Ten subselect by sel dat i jako join, ale ve vysledku by to bylo to same, zalezi na tom, co tvuj SQL server podporuje
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Bebeno 29. 11. 2020 22:41

Ahoj Jan.

Dakujem za odpoved.
Pouzivam databazu Mysql .
V tabulke mám prvy stlpec id riadku ktory ma index, ma stlpci s casom zapisu ktory sa vola time nemam index.

Skusim tvoje riesenie a dam vediet ci je to to co potrebujem, aj ked ma teraz napada že ak by tabulka mala niečo cez 1 milion riadkov či by to nebolo potom pomale.
Ta selekcia bude ešte okresana podla mesiacov. Potrebujem to vykreslit pomocou google time line grafu.

ďakujem
Bebeno
Kolemjdoucí

Odeslat příspěvekod Emil Pastelka 30. 11. 2020 03:24

Pokud máte kontrolu i nad procesem, který do tabulky zapisuje, přidal bych třetí sloupec "počet minut od předešlého záznamu". Všechny následné kroky se tím výrazně zjednoduší a získáte tak i možnost v budoucnu filtrovat podle jiných časových úseků.
Emil Pastelka
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 30. 11. 2020 09:34

Pokud máš ID řádku, nezasahuješ do něj, pak se to dá napsat i jinak a líp

Opět 2 selecty z jedné tabulky:

select t1.*
from Tabulka t1
join Tabulka t2 on t1.ID = t2.ID - 1
where TimeDiff(t1.cas, t2.cas) > 15*60
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Bebeno 30. 11. 2020 10:51

Emil - ano mam kontrolu aj nad zapisom . Rozmyslal som aj nad tímto riesenim ale nenapdlo ma ako to spraviť.
Ja som zatial čo sa Mysql databázy tíka mierne pokročilý začiatočník, takže stále bádam.

Jan - super toto sql funguje.
Ak by som tam chcel pridať ešte hodnotu z riadke pre tým čo mi teraz vybralo a aj časový rozdiel tak to sql by malo ako vyzerať? Môžem ťa poprosiť ešte o pomoc aj s týmto?

ďakujem páni

Ivan
Bebeno
Kolemjdoucí

Odeslat příspěvekod JanFiala 30. 11. 2020 14:46

select t1.*, t2.cas, TimeDiff(t1.cas, t2.cas) as CasovyRozdil
from Tabulka t1
join Tabulka t2 on t1.ID = t2.ID - 1
where TimeDiff(t1.cas, t2.cas) > 15*60
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod Bebeno 30. 11. 2020 16:59

Jan Ďakujem velmi pekne. Presne toto som potreboval.
Mysql databázový systém ma strašne baví, dajú sa s tým robiť pekné štatistiky len sa v tom musím zdokonaliť.
Multiselect z jednej tabulky som doteraz nevedel :-)

Ďakujem ešte raz

Ivan
Bebeno
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků