postgres, ostatnia data dla kilku id.
mhyjek - 14-12-2006 16:08
postgres, ostatnia data dla kilku id.
tabela nazwijmy ja >tabela< wyglada tak: id | date | time 1 | 06-11-25 | 12:00:25 1 | 06-11-25 | 13:00:25 2 | 06-11-25 | 11:00:25 3 | 06-11-25 | 12:01:50 3 | 06-11-25 | 12:01:53
chce z tej tabeli wybrac po jednym najstarszym rekordzie dla id = 1 i 2. oczywiscie chcialbym to jakos jednym zapytaniem jesli to mozliwe pojazdow do wyboru bedzie wicej to jest tylko przyklad wyszedlem od takiego zapisu ale rzecz jasna nie dziala on prawidlowo i utknalem i skonczyly mi sie pomysly. w ogole nie wiem czy jest to do zrobienia jednym zapytaniem
select * from tabela where vehicle_id = ANY (ARRAY[1,2]) order by "date" desc, "time" desc limit 1;
Andrzej Kosmala - 14-12-2006 16:08
U?ytkownik "mhyjek" <mhyjek@motronik.com.pl> napisa? w wiadomo?ci news:1164626021.716356.279240@f16g2000cwb.googlegr oups.com... > tabela nazwijmy ja >tabela< wyglada tak: > id | date | time > 1 | 06-11-25 | 12:00:25 > 1 | 06-11-25 | 13:00:25 > 2 | 06-11-25 | 11:00:25 > 3 | 06-11-25 | 12:01:50 > 3 | 06-11-25 | 12:01:53 > > chce z tej tabeli wybrac po jednym najstarszym rekordzie dla id = 1 i > 2. > oczywiscie chcialbym to jakos jednym zapytaniem jesli to mozliwe > pojazdow do wyboru bedzie wicej to jest tylko przyklad > wyszedlem od takiego zapisu ale rzecz jasna nie dziala on prawidlowo i > utknalem > i skonczyly mi sie pomysly. w ogole nie wiem czy jest to do zrobienia > jednym zapytaniem > > select * from tabela > where vehicle_id = ANY (ARRAY[1,2]) > order by "date" desc, "time" desc > limit 1;
SELECT id,min(date+time) FROM tabela GROUP BY id WHERE id IN (1,2);
--
Pozdrawiam, Andrzej Kosmala
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 14-12-2006 16:08
mhyjek wrote: > tabela nazwijmy ja >tabela< wyglada tak: > id | date | time > 1 | 06-11-25 | 12:00:25 > 1 | 06-11-25 | 13:00:25 > 2 | 06-11-25 | 11:00:25 > 3 | 06-11-25 | 12:01:50 > 3 | 06-11-25 | 12:01:53 > > chce z tej tabeli wybrac po jednym najstarszym rekordzie dla id = 1 i > 2. > oczywiscie chcialbym to jakos jednym zapytaniem jesli to mozliwe > pojazdow do wyboru bedzie wicej to jest tylko przyklad > wyszedlem od takiego zapisu ale rzecz jasna nie dziala on prawidlowo i > utknalem > i skonczyly mi sie pomysly. w ogole nie wiem czy jest to do zrobienia > jednym zapytaniem > > select * from tabela > where vehicle_id = ANY (ARRAY[1,2]) > order by "date" desc, "time" desc > limit 1;
Niepotrzebnie rozbija?e? czas na dat? i godzine.
select * from tab t, (select p.id,max((p.date || ' ' || p.time)::timestamp) as czas from tab p group by id) s where t.id = s.id and (t.date || ' ' || t.time)::timestamp = s.czas
-- P.M.
hubert depesz lubaczewski - 14-12-2006 16:08
On 2006-11-27, mhyjek <mhyjek@motronik.com.pl> wrote: > tabela nazwijmy ja >tabela< wyglada tak: > id | date | time > 1 | 06-11-25 | 12:00:25 > 1 | 06-11-25 | 13:00:25 > 2 | 06-11-25 | 11:00:25 > 3 | 06-11-25 | 12:01:50 > 3 | 06-11-25 | 12:01:53 > chce z tej tabeli wybrac po jednym najstarszym rekordzie dla id = 1 i > 2. > oczywiscie chcialbym to jakos jednym zapytaniem jesli to mozliwe > pojazdow do wyboru bedzie wicej to jest tylko przyklad > wyszedlem od takiego zapisu ale rzecz jasna nie dziala on prawidlowo i > utknalem > i skonczyly mi sie pomysly. w ogole nie wiem czy jest to do zrobienia > jednym zapytaniem > select * from tabela > where vehicle_id = ANY (ARRAY[1,2]) > order by "date" desc, "time" desc > limit 1;
poczytaj o "distinct on".
depesz
-- http://www.depesz.com/ -> nowy, jeszcze lepszy, depesz
mhyjek - 14-12-2006 16:08
witam. ostatecznie zapytanie przybralo postac: SELECT * FROM tabela WHERE (date+time) IN(SELECT MAX(date+time) FROM tabela WHERE id IN (1,2) GROUP BY id);
zapytanie zwraca wszsykie kolumny - w odroznieniu do zapytania proponowanego przez Andrzeja, i jest duzo prostsze od zapytania proponowanego przez Pawla. O DISTINCT czytalem i teraz i troche wczesniej ale jakos nie naprowadzilo mnie to na zaden slad.
Antoni Jakubiak - 14-12-2006 16:08
mhyjek wrote: > witam. > ostatecznie zapytanie przybralo postac: > SELECT * FROM tabela > WHERE (date+time) > IN(SELECT MAX(date+time) FROM tabela WHERE id IN (1,2) GROUP BY id); > > zapytanie zwraca wszsykie kolumny - w odroznieniu do zapytania > proponowanego przez Andrzeja, i jest duzo prostsze od zapytania > proponowanego przez Pawla. > O DISTINCT czytalem i teraz i troche wczesniej ale jakos nie > naprowadzilo mnie to na zaden slad. >
To zle. PostgreSQL rozszerza standard SQL o pojecie distinct on:
select distinct on ( id ) id, czas from tabela order by id, czas
hubert depesz lubaczewski - 14-12-2006 16:08
On 2006-11-27, mhyjek <mhyjek@motronik.com.pl> wrote: > O DISTINCT czytalem i teraz i troche wczesniej ale jakos nie > naprowadzilo mnie to na zaden slad.
pisa?em o "DISTINCT ON" a nie o "DISTINCT"!
depesz
-- http://www.depesz.com/ -> nowy, jeszcze lepszy, depesz
A.L.E.C - 14-12-2006 16:08
mhyjek wrote: > witam. > ostatecznie zapytanie przybralo postac: > SELECT * FROM tabela > WHERE (date+time) > IN(SELECT MAX(date+time) FROM tabela WHERE id IN (1,2) GROUP BY id);
O DISTINCT ON ju? dosta?e? info, to ja mo?e odnios? si? do tego zapytania. Je?li kombinacja date+time nie jest unikalna musisz napisa?:
WHERE id IN (1,2) AND (date+time) IN(SELECT MAX(date+time) FROM tabela WHERE id IN (1,2) GROUP BY id);
p.s. pewnie poprawi to te? wydajno??
-- Aleksander 'A.L.E.C' Machniak http://alec.pl gg-2275252 LAN Management System Developer http://lms.alec.pl
mhyjek - 14-12-2006 16:09
Ok. Moj blad chodizlo mi oczywiscie o "DISTINCT ON". Wyrazilem sie nieprecyzyjnie. Nie wiem tylko dlaczego chociazby najprostsze uzycie tego w mojej tabeli generowalo bledy. Dokumentacje przeczytalem dokladnie. Dlatego zapytanie przybralo postac jak napisalem. Ale peniw powroce do tematu "distinct on". Dodam tylko ze te trzy pola w przykladzie z pierwszego pola to tylko fragment calej struktury, w sumie 23 pola.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
=?ISO-8859-2?Q?[psql]_Polskie_t=B3umaczenie_?= =?ISO-8859-2?Q?licencji_BSD_dla_PostgreSQL=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plmorebeer.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|