MySQL databáze - výběr po 5 minutách

Od: Datum: 26.01.16 15:30 odpovědí: 16 změna: 28.01.16 09:22

Mám databázi MySQL s tabulkou obsahující:

datum, čas, hodnota.

Ukládám hodnotu každou minutu, ale já bych potřeboval třeba výstup po 5 minutách se součtem

všech předchozích 5 hodnot (za posledních 5 minut) a to za celý den.

Lze toto nějak udělat dotazem na databázi?


Seznam odpovědí:
 
moment čekejte prosím, probíhá přenos dat...
Zobrazení struktury odpovědí v otázce
Skrytí struktury odpovědí v otázce
Zobrazení struktury odpovědí v otázce

 

Odpovědi na otázku:
Datum: 26.01.16 17:22

Nezkoušel jsem, ale něco takového:

SELECT SUM(hodnota)

FROM table

ORDER BY cas

LIMIT 5

Ohodnoceno: 0x
 
Datum: 26.01.16 17:34

Tohle vám dá jeden řádek, ve kterém bude součet všech hodnot.

Předně místo datum a čas používejte jen jeden sloupec typu DATETIME nebo TIMESTAMP, zjednoduší se vám to.

Pak lze provést jeden select, ve kterém to datum "zaokrouhlíte" na pětiminutovky (musíte exportovat datum a hodinu a minutu dopočítat) a pak tuhle hodnotu vyberete a zároveň přes ní provedete group by.

Ohodnoceno: 0x
 
Datum: 26.01.16 18:16

A jo, špatně pochopené zadání :-D

Ohodnoceno: 0x
 
Datum: 26.01.16 18:03
avatar

selectem zjistite posledni ID, a pak si v cyklu odpoctete nasobky 5ti, sectete a zobrazite


doplněno 26.01.16 21:51:

? ja taky *nevi*


doplněno 26.01.16 21:52:

resp, ja mluvim take o dtb :)


doplněno 27.01.16 18:41:

nevim proc to za kazdou cenu musi byt v jednom slozitem dotazu, kdybys to udelal normalne tak uz to mas davno hotove
$i=0; $pocet

while (dotaz)
$i++; $pocet=$pocet+$dotaz[cislo]

if ($i =5) $i=0; $pocet=0;

Ohodnoceno: 0x
 
Datum: 26.01.16 21:44

Myslel jsem, že má databázi, ne textový soubor.

Ohodnoceno: 0x
 
Datum: 27.01.16 19:29
avatar
Jde o počet záznamů a kolik toho chci analyzovat. Běžně mám tabulky se statisici řádků a to přece nebudu místo jednoho dotazu zpracovanemu za 0.05sec vytvářet cyklus, který se bude postupně ptát na každý záznam zvlášť a zahlti mi DB na pár vteřin.
Ohodnoceno: 0x
 
Datum: 27.01.16 20:23
avatar

tak jasne, zalezi od projektu... proto uz od zacatku bych asi postupoval uplne jinou cestou nez to dela on (anebo bych si pocital uz pri tom minutovem zapisu tu petiminutovou promennou rovnou a cpal bych si ji do session a nebo dtb, podle toho, k cemu to ma..vubec nevim, co to jsou za data a proc to dela a proc to kazdou minutu zapisuje :) ... nicmene tazatel se pta na zobrazeni jen 1 dne, ten si zameri a tech 1400 zaznamu(zapis kazdou minutu) ve 3columnove tab je projete cyklem a zobrazene taky za 0.05s.

ke vsemu to chce nacpat do tabulky, jak jinak nez v cyklu :) akorat se probere 5x vice dat

Ohodnoceno: 0x
 
Datum: 26.01.16 21:57
avatar

pokud jsem to správně pochopil

sum(hodnota) as soucet from tabulka where DATE_ADD(datum,INTERVAL 5 minutes)>NOW()

pokud je datum ve formátu datetime YYYY-MM-DD HH:MM:SS, je zbytečné ukládat datum a čas zvlášť, ne? :)

Ohodnoceno: 0x
 
Od: edik
Datum: 27.01.16 11:35

Co je to za příkaz DATE_ADD to mi nějak MySQL ani hlava nebere :)


doplněno 27.01.16 11:47:

Teda phpMyAdmin mi to nežere :(

Datum: 27.01.16 11:53
avatar
Žere to obojí. K času přidá 5 min a když je to víc než aktuální čas tak to splní podmínku. Jak efektivní a prosté.
Ale datum musí být být ve formátu viz výše. To si předělej. Pak bude fungovat.
doplněno 27.01.16 12:34:

celý den doplníš: Interval 1 day, ale to dotaz musel být o půlnoci, jinak musíš specifikovat raději přesně den!

Ohodnoceno: 0x
 
Od: edik
Datum: 27.01.16 12:04

Díky za rychlou odpověď,

funkce TIME_ADD asi neexistuje, že? Asi mi nezbude než to předělat :)

Datum: 27.01.16 12:31
avatar

existuje, nemám ji vyzkoušenou: ADDTIME(cas, "00:05:00") //měla by přidat 5 minut.

cas = pole v tabulce, ale to už asi víš :)

Ohodnoceno: 0x
 

 

Od: edik
Datum: 27.01.16 12:44

Teď si ale tak říkám, že si asi nerozumíme. Potřebuji toto:

Mám nyní teda polozky DatumCas a Hodnota

19.5.2015 8:00:00 - 2

19.5.2015 8:01:00 - 5

19.5.2015 8:02:00 - 9

19.5.2015 8:03:00 - 5

19.5.2015 8:04:00 - 5

a já potřebuji tento výsledek např.

19.5.2015 8:00:00 - 26 nebo 19.5.2015 8:05:00 - 26

pro další pětici by pak vylezl další řádek nové tabulky

je toto nějak možné udělat?

Datum: 27.01.16 13:14
avatar

vzhledem k tomu, že jde dělit čas (což jsem ani netušil) by to snad šlo zhruba takhle:
select CEILING(time("8:01:00")/time("0:05:00")) as kolikrat_5min

tím dostaneš do z každého řádku kolikátá 5 minutovka to je, pak už udělat sumy podle toho znaku zvládneš, ne? (group by kolikrat_5min)

doslova to je čas v tabulce děleno 5 min = číslo, které se zaokrouhlí na celé číslo nahoru, tj pro tebe něco jako číslo pětiminutovky (ekvivalent např k dnu, týdnu atd), podle toho budeš dávat skupiny k sobě.


doplněno 27.01.16 13:17:

ale přidej si do te kolikrat_5min i datum, jinak ti to bude sčítat napříč dny. funkce concat()

a samozřejmě to budou nejméně 2 vnořené dotazy (dotaz z dotazu)

Ohodnoceno: 2x
 
Datum: 27.01.16 13:35
avatar

funguje to ;)

tabulka dat:
INSERT INTO `test` (`datum`, `cas`, `hodnota`) VALUES
(2016-01-27, 06:00:00, 2),
(2016-01-27, 06:01:00, 3),
(2016-01-27, 06:04:00, 4),
(2016-01-27, 06:02:00, 3);

select sum(hodnota) as soucet, concat(datum,"-",kolikrat_5min) as znak from(
select *, CEILING(time(cas)/time("0:05:00")) as kolikrat_5min from test
) as x group by znak

Má to jen chybicku, že čas se groupuje 06:01:00 - 06:06:00 atd není, to od nuly. Ale pětiminutovky to jsou. Otestuj si to na větší tabulce, mě se nechtělo vkládat tolik záznamů.

Ohodnoceno: 2x
 
Od: edik
Datum: 28.01.16 09:22

Velké díky za rady,

nakonec jsem upravil Váš dotaz do této podoby, který funguje přesně jak potřebuji :

SELECT *, SUM(Hodnota) as soucet, TRUNCATE((time(DatumCas)/time("0:05:00")),0) as podil, time(TRUNCATE((time(DatumCas)/time("0:05:00")),0) * time("0:05:00")) as casupraven FROM `databaze` WHERE 1 GROUP BY podil

 

 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz

 
Copyright © 2004-2016 Poradna Poradte.cz. Všechna práva na poradně Poradte.cz vyhrazena.