Autor Zpráva
jtfcobra
Profil
Mám záznamy
1.1.2017 7:00 xxx hodnota
1.1.2017 8:00 xxx hodnota
1.1.2017 9:00 xxx hodnota
1.1.2017 10:00 xxx hodnota
1.1.2017 20:00 xxx hodnota
1.1.2017 23:00 xxx hodnota
2.1.2017 7:00 xxx hodnota
2.1.2017 8:00 xxx hodnota
2.1.2017 9:00 xxx hodnota
2.1.2017 10:00 xxx hodnota
2.1.2017 20:00 xxx hodnota
2.1.2017 23:00 xxx hodnota
atd.....

premyslim jak to promazat aby tam byl jen prvni zaznam dne a posledni zaznam dne
Takto:
1.1.2017 7:00 xxx hodnota
1.1.2017 23:00 xxx hodnota
2.1.2017 7:00 xxx hodnota
2.1.2017 23:00 xxx hodnota

Poradíte?
Taps
Profil
jtfcobra:
používáš v databázi datetime? pokud ano, tak by to mohlojít jednoduše pomocí podmínky where
Keeehi
Profil
Navíc pokud je zaručeno, že první záznam je v 7 hodin a žádný jiný záznam v 7 hodiny není a poslední je ve 23 a žádný jiný ve 23 taky není (stejně jako v ukázce) tak by to mělo jít velmi jednoduše.
Jaká je tedy struktura tabulky?
jtfcobra
Profil
DROP TABLE IF EXISTS `cem`.`spotreba`;
CREATE TABLE  `cem`.`spotreba` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `seriovecislo` text,
  `datum` datetime DEFAULT NULL,
  `hodiny` text,
  `idmeraku` text,
  `merak` text,
  `byt` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1332621 DEFAULT CHARSET=utf8;
Keeehi
Profil
No a co ta omezení co jsem popsal, ta platí? A nebo ukázka nereflektuje skutečnost? Protože pokud neplatí, tak pak se nedá použít ten jednoduchý způsob.
Taps
Profil
jtfcobra:
proč jsou hodiny jako text?
Kajman
Profil
Osobně bych to asi ani nemazal. Nemělo by to moc zabírat a pokud jsou v některých sloupcích, kde máte datový typ text, samé číselné hodnoty, změnte datový typ sloupce. A udělejte indexy pro dotazy, které trvají dlouho.

Pokud trváte na mazání, tak bych použil delete ... using syntaxi. Napadají mě dvě varianty, ale nevím, co bude rychlejší (bez přidaných indexů nebude jistě rychlé ani jedno a dotaz možná server díky tomu nezvládne dokončit).

a) tabulku zkusím propojit vnějším spojením s podotazem na té samé tabulce hledající maximální hodnoty času v každý den a pro každý měřák (nebo byt, to záleží na Vás, co chcete vlastně mazat). Propojení udělejte i poddotaz hledající minimální hodnoty. Do obou spojení zahrňte i čas a smažte ty, řádky, které nebyly nalezeny v maximálním ani minimálním poddotaze.

b) tabulku zkusim propojit vnitřním spojením s tou samou tabulkou s podmínkou, že je stejné datum, měřák a čas je větší. Druhé spojení, že je stejné datum, měřák a čas je menší. Mazejte však jen z prvního aliasu.
jtfcobra
Profil
Takle:

DROP TABLE IF EXISTS `cem1melnik`.`spotreba`;
CREATE TABLE  `cem1melnik`.`spotreba` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `seriovecislo` text,
  `datum` datetime DEFAULT NULL,
  `hodiny` int(10) unsigned DEFAULT NULL,
  `idmeraku` text,
  `merak` text,
  `byt` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1354548 DEFAULT CHARSET=utf8;

?

mas priklad a) nebo b) jako kod ?
Kajman
Profil
Pokud uděláte drop tabulky, tak už nebude co mazat. Zkuste ještě popsat sloupce - co tam bývá za hodnoty a jaký mají v tabulce logický smysl.
jtfcobra
Profil
Co tohleto ?

To procisti stejne zaznamy ale nevim jak udelat aby tam zbyli jen zaznamy co maji zmeny v hodinach napr 1.1 , 1.2 atd....

DELETE tabulka1
FROM cem1melnik.spotreba tabulka1
JOIN cem1melnik.spotreba tabulka2 ON tabulka2.hodiny = tabulka1.hodiny
WHERE tabulka1.id > tabulka2.id
Kajman
Profil
Toto by mělo zachovat pro každou kombinaci datumu a hodin nejvyšší a nejnižší hodnotu ze sloupce datum.

Minimálně pro mazání bych si udělal index nad sloupci (hodiny,datum), možná bych si i dočasně přidal pomocný sloupec, kde bude jen datum bez času. Pak bych udělal index nad třemi sloupci (hodiny,pomocnysloupec,datum) a místo podmínek Date(datum) bych použil ten pomocný sloupec.

Mazání nejprve řádně otestujte na kopii dat.
DELETE kesmazani
FROM   cem1melnik.kopiespotreba kesmazani
       JOIN cem1melnik.kopiespotreba nejakemensi
         ON kesmazani.hodiny = nejakemensi.hodiny
            AND Date(kesmazani.datum) = Date(nejakemensi.datum)
            AND kesmazani.datum > nejakemensi.datum
       JOIN cem1melnik.kopiespotreba nejakevetsi
         ON kesmazani.hodiny = nejakevetsi.hodiny
            AND Date(kesmazani.datum) = Date(nejakevetsi.datum)
            AND kesmazani.datum < nejakevetsi.datum

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: