Nejste přihlášen/a.
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?
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.
selectem zjistite posledni ID, a pak si v cyklu odpoctete nasobky 5ti, sectete a zobrazite
? ja taky
resp, ja mluvim take o dtb
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;
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
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ášt, ne?
Co je to za příkaz DATE_ADD to mi nějak MySQL ani hlava nebere
Teda phpMyAdmin mi to nežere
celý den doplníš: Interval 1 day, ale to dotaz musel být o půlnoci, jinak musíš specifikovat raději přesně den!
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íš
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?
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ě.
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)
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ů.
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
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.
Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.