SQL Join-ban szűrés
Sziasztok!
Egyszerű adatbázis utasítással lehetséges lenne-e az összes termosztátot kilistázni, és a hozzá tartozó utolsó hőmérséklet-et? Mert eddig csak arra találtam módot, hogy listázom a termosztátokat, és utána a maximális hőmérsékletet a termosztátokhoz.
DDL:Segítségeteket köszönöm!
■ Egyszerű adatbázis utasítással lehetséges lenne-e az összes termosztátot kilistázni, és a hozzá tartozó utolsó hőmérséklet-et? Mert eddig csak arra találtam módot, hogy listázom a termosztátokat, és utána a maximális hőmérsékletet a termosztátokhoz.
DDL:
CREATE TABLE `temperature` (
`temp_id` int(11) NOT NULL AUTO_INCREMENT,
`therm_id` int(11) NOT NULL,
`temp_current` DOUBLE NOT NULL,
`date` timestamp NOT NULL,
PRIMARY KEY (`temp_id`),
KEY `term_id` (`therm_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=16607333 ;
CREATE TABLE `thermostat` (
`therm_id` int(11) NOT NULL AUTO_INCREMENT,
`therm_name` varchar(50) NOT NULL,
PRIMARY KEY (`therm_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;
ALTER TABLE `temperature`
ADD CONSTRAINT `temperature_ibfk_3` FOREIGN KEY (`therm_id`) REFERENCES `thermostat` (`therm_id`),
Félek, hogy rosszul értem,
SELECT a.therm_id,a.therm_name,MAX(b.temp_current) FROM thermostat a,temperature b WHERE a.therm_id=b.therm_id GROUP BY a.therm_id,a.therm_name;
Nem ezt akarod? (100%-ig nem vagyok biztos benne, hogy szintaktikailag OK, rég játszottam SQL-lel :( )
Válaszod köszönöm! Lehet
Lehet elég kevés infót adtam meg.
Szóval:
Vannak a termosztátok (thermostat táblában felsorolva), amelyek 5 percenként mintát vesznek, és beszúrnak egy új rekordot a temperature táblába.
Azt kéne megoldanom, hogy az összes termosztátot kilistázni, és mellé az utoljára mért hőmérsékletet is, és nem akarom feltétlenül a termosztátokat kilistázni, és utólag, új selecttel hozzá venni a legutolsó hőmérsékletet.
Arra gondoltam, hogy inner join-nal összekötöm a termosztátonként grouppolt hőmérsékleteket, csak ugye a sellistában nem állhat nem aggregált attribútum a group attribútuma mellett (pl. MAX(date), temp_id).
Vagy rendezett, limit 1-gyel ellátott selecttel kapcsolom össze.
Sajnos egyre inkább úgy érzem, hogy amit szeretnék, egyszerű sql-ben nem lehet megcsinálni, lehet, mivel postgres a szerver, írok rá egy függvényt.
Bocs, szokás szerint csak
(most az átlagosnál is hülyébb vagyok, mert dokihoz készülök és ahogy a múltkor elnéztem, a doki sem áll jobban agyilag, mint én :( )
Esetleg a HAVING nem segít? (tartok tőle, hogy nem)
Ehhh... azt hiszem, most jobb lesz, ha eldugulok.
Szerintem alaptalanul vannak
Francokat... amit itt
(hűűű... ezt a mai dokit szívesen elmesélném valakinek... azt hittem, egészségügyben engem már nem érhet meglepetés. Tévedtem. Szóval nem volt alaptalan a reggeli agybajom :( :D )
Én valami ilyesmit csinálnék.
Pont úgy egyikben sem fog
Ami az al-lekérdezés order by-ját illeti, tök fölösleges, mert MySQL és PostgreSQL is külső group by hatására átrendezi az adatokat a feldolgozás során.
(Az on feltétel körüli kerek zárójelek szerintem csak az olvashatóságot rontják.)
Pont úgy egyikben sem fog
Ebben lehet, hogy igazad van, nem néztem utána, de ez csak kis módosítás.
Nem fölösleges. A külső group valóban átrendezi az adatokat, de hogy jó legyen az eredmény, a belső querybe kell az order. MySQL-nél legalábbis az történik ilyenkor, hogy mivel van group, de nincs aggregátum, a sorok közül a group by-nak megfelelő, fizikailag első találat (sor) kerül az eredménybe. Ez a fizikailag első találat pedig a belső order by miatt a legutóbb felvitt érték lesz az adott termosztáthoz. Mondom, postgre-ben nem tudom ez így van-e.
Utánanéztem, igazad van. Kell
Ah, szóval arra pályáztál.
Igen, én is úgy vettem észre,
Ami nem aggregátum, azt mind
Ezt érdemes lenne kipróbálni!
Megnéztem, jól működik,
Megnéztem, jól működik, azonban az "mindent-joinolok-mindennel" miatt 43 mp a futási ideje lokális gépen, szerveren pedig a jóval több adat miatt 2 perc után állítottam le.
Még azt próbáld meg, hogy a
30 mp és 45 mp. Ne menj el
(Az on feltétel körüli kerek
Kivéve akkor, ha több feltétel is van az on-ban
Próbáld ezt!
Szerintem ez nem lesz jó. A
Pontosítok
Köszönöm válaszod! 14 mp
14 mp lokális gépen, 36 mp szerveren, LIMIT 50-nel a WHERE feltételben 25 mp. 22 millió rekord van a temperature táblában, ezzel kéne valami csinálni.
22 millió rekord van a
Pl. archiválni az 1 napnál régebbieket?
Sajnos máshol van rá
1000bocs, ha a szokásos
Asszem, Oracle forrásból származó tipp: particionált index? Létezik ilyen postgresql-ben?
(remélem, most nem írok nagy marhaságot... :-) )
Legutolsó id
Még konzultálok az többi
Mindenhol index, és nézet
Ez már elég elfogadható.