Promazání tabulky, nechat každý 6 záznam – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Promazání tabulky, nechat každý 6 záznam – MySQL – Fórum – Programujte.comPromazání tabulky, nechat každý 6 záznam – MySQL – Fórum – Programujte.com

 

Pavelv0
Stálý člen
27. 6. 2018   #1
-
0
-

Zdravím, mám v DB sloupec datetime ve kterém jsou záznamy po 10 vteřinách. Lze nějak promazat starší záznamy tak, aby tam zbyl v dané minutě třeba jen první záznam. Něco jako vymazat vše starší, kromě GROUP BY SEC(time). Jako jedniné řešení mi zatím napadá udělat select nad daty co tam mají zbýt a zkopírovat je do dočasné tabulky. Poté originál smazat a z dočasné tabulky je přesunout zpět. Připadá mi to ale moc složité.

Mazání bych poté chtěl nastavit jako trigger při vložení nového záznamu.

Nahlásit jako SPAM
IP: 95.47.186.–
Kit+15
Guru
27. 6. 2018   #2
-
0
-

#1 Pavelv
Když uděláš SELECT nad daty, které v té tabulce mají zůstat, získáš pohled. Když tento pohled odečteš MINUS od původní tabulky, dostaneš záznamy, které chceš smazat. Je to jen jeden SQL příkaz. Dávej si pozor na to, abys nevyhledával id v tom pohledu, protože nebývá indexován. Proto je lepší místo IN použít JOIN, se kterým má optimalizátor víc prostoru, aby to udělal správně.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:8dc:7...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
28. 6. 2018   #3
-
0
-

Udělal bych si novou tabulku s nějakým názvem a do ní nakopíroval data, která mají zůstat. Až bude v nové tabulce vše bych starou přejmenoval nebo smazal a novou přejmenoval na správné jméno. Možná by to bylo vhodné provést jako transakci. Pro vybírání dat s daným časovým rozestupem (jedna hodnota za 120 sec apod.) použij modulo. Jak na to najdeš http://programujte.com/forum/vlakno/27050-vybrat-hodnoty-se-zadanym-casovym-rozestupem/

hu

Nahlásit jako SPAM
IP: 195.178.67.–
28. 6. 2018   #4
-
0
-

Alternativní postup: starou tabulku přejmenovat a vytvořit novou. Do nové zkopírovat jen co je potřeba, pak starou odstranit.

Ještě lze vybírat a mazat řádky, podmínka se změní na mod(to_seconds(cas) - to_seconds('2014-04-11 11:21'), 120) != 0

Nezasahovat do staré tabulky má jednu výhodu: data někde zůstávají nedotknutá, je menší riziko jejich ztráty nebo poškození.

Když o tom tak přemýšlím, tak by to bylo vhodné jako transakci provést vždy - při chybě můžeš provedené vzít zpět (rollback).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kit+15
Guru
28. 6. 2018   #5
-
0
-

#1 Pavelv
Pokud by to povaha dat dovolila, tak bych místo MySQL použil RRDtool. Je určen k monitorování provozu a je tedy pro zmíněné účely mnohem lépe vybaven, s minimální zátěží systému. Nevadí mu ani chybějící záznamy a umí interpolovat, pokud se zeptám na údaje v konkrétním čase mezi uloženými hodnotami.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:745d:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Pavelv0
Stálý člen
31. 7. 2018   #6
-
0
-

RRDtool není možné použít. Zkoušel jsem několik možností s LEFT JOIN i MINUS, ale vždy jsem spíš skončil na syntaktické chybě, než na nějakém výsledku. jak to mám udělat bez identifikátoru? V tabulce mám sloupce id, IP, time a data a chtěl bych promazat všechny starší záznamy od dané IP. třídění dle GROUP BY UNIX_TIMESTAMP(time) DIV 60 mi vyhovuje.

Nahlásit jako SPAM
IP: 95.47.186.–
peter
~ Anonymní uživatel
4016 příspěvků
1. 8. 2018   #7
-
0
-

'Zkoušel jsem několik možností' - vypsat moznost, vypsat text chyby. Pak je mozne diskutovat o tom, co tam mas spatne.

Nahlásit jako SPAM
IP: 90.176.141.–
1. 8. 2018   #8
-
0
-

Dával jsem ti odkaz na vlákno, kde jsme řešili jak vybrat jednu hodnotu za časový úsek, který byl v sekundách. Pro 2 minuty = 120 sekund to bylo: 

select cas, teplota from leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(to_seconds(cas) - to_seconds('2014-04-11 11:21'), 120) = 0;

Pokud bych chtěl tedy ponechat záznamy každých 120 sec, zbytek ztratit, mohu:
1. vytvořit novou tabulku
2. upravit výše uvedenou query a naplnit tak novou tabulku (syntaxe insert ... select)
3. starou tabulku odstranit
4. novou tabulku přejmenovat

Nebo upravit query tak aby mazala nepotřebné řádky, mohlo by to vypadat takto: 

DELETE FROM leva_teploty where
 (cas between '2014-04-11 11:21' and '2014-04-11 11:31')
 and mod(to_seconds(cas) - to_seconds('2014-04-11 11:21'), 120) != 0;

nemám vyzkoušeno.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
1. 8. 2018   #9
-
0
-

   

DELETE FROM test where
 mod(to_seconds(cas) - to_seconds('2018-04-12 11:46:40'), 60) != 0;

ponechá hodnoty s odstupem po 1 minutě = 60 sekund. Čas 2018-04-12 11:46:40 je vztažná hodnota vůči které počítá rozestup. Byla to nejstarší hodnota, jsem ji zadal ručně, ale asi by šla získat pomocí funkce min(). Pokud to chceš omezit po nějaký čas, tak přidáš do where ještě podmínku cas < požadovaný_čas.

Tabulka test měla 250 záznamů s rozestupem 1 s, zůstalo 5 záznamů po 1 minutě

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Pavelv0
Stálý člen
3. 8. 2018   #10
-
0
-

#9 hlucheucho
No mám sice záznamy po 10s ale občas taky po 9 či 11. Tam asi to porovnání na nulu nepujde, ale každopádně dobrý nástřel, nečekal jsem, že to pujde takto jednoduše....

Nahlásit jako SPAM
IP: 185.99.177.–
3. 8. 2018   #11
-
0
-

Jde taky zkopírovat data do tabulky která bude mít navíc int auto increment sloupec. Ten se ti vyplní sám po sobě jdoucími čísly a pak stačí modulo uplatnit na tento sloupec. To způsobí, že zůstane první záznam, vynechá 2 - 5 záznam, zachová 6 záznam, vynechá 7 -10 ....

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý