Portál AbcLinuxu, 23. dubna 2024 14:40


Dotaz: řádky s max hodnotou

15.1.2013 21:13 Mike
řádky s max hodnotou
Přečteno: 477×
Odpovědět | Admin
Ahoj všem

potřebuji vrátit řádky (Stačí id) s nejvyšším datumem pro každý stroj

id |stroj |opraven
1 pluh 1.1.2001
2 lopata 5.2.2001
3 pluh 3.3.2001
4 vidle 3.3.2001
by mělo vrátit
2
3
4

Řádek s id 1 chybí, protože pro pluh má řádek 3 vyšší datum
Prosím o pomoc s tvorbou dotazu

Mike

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.1.2013 22:31 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: řádky s max hodnotou
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ahoj

Pokud to ma byt v SQL, tak potrebujes max() (a k nemu samozrejme group by)

Dejv

Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
16.1.2013 09:05 s0 | skóre: 32 | blog: nejchytřejší kecy | prágl
Rozbalit Rozbalit vše Re: řádky s max hodnotou
Odpovědět | | Sbalit | Link | Blokovat | Admin
create table t
(
    id number not null,
    stroj varchar2(10) not null, -- FK?
    opraven date not null
);

insert into t values (1, 'pluh', sysdate-10);
insert into t values (2, 'lopata', sysdate);
insert into t values (3, 'pluh', sysdate);
insert into t values (4, 'vidle', sysdate);

commit;

select * from t;

ID STROJ  OPRAVEN
== ====== ===================
1  pluh   2013-01-06 07:52:45
2  lopata 2013-01-16 07:52:53
3  pluh   2013-01-16 07:52:54
4  vidle  2013-01-16 07:52:54

select id
    from (select id, row_number() over (partition by stroj order by opraven desc) as r
              from t)
    where r = 1;

ID
==
2 
3 
4 

zbytek si dohledej za domácí úkol. Včetně ošetření toho, co by se stalo kdybys měl stejné maximální datum ve více řádcích jednoho stroje...
Kuolema Kaikille (Paitsi Meille).
Josef Kufner avatar 17.1.2013 13:22 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: řádky s max hodnotou
Odpovědět | | Sbalit | Link | Blokovat | Admin
Získat max datu je lehké (max a group by), získat ostatní sloupce na takovém řádku už vyžaduje trošku kouzlení. Asi nejjednodušší je pak udělat join sama se sebou podle data a toho, co jsi dal do group by.

Tedy něco takového:
SELECT t.*
FROM (SELECT stroj, MAX(opraven) as max_opr FROM tabulka GROUP BY stroj) AS m
LEFT JOIN tabulka AS t ON t.stroj = m.stroj AND t.opraven = m.max_opr
Pokud ale jde o nějaké netriviální množství dat, raději bych si přidal do tabulky strojů sloupec s datem poslední opravy, který by byl vypočítáván podle obsahu tabulky s opravami.
Hello world ! Segmentation fault (core dumped)
17.1.2013 19:47 díky
Rozbalit Rozbalit vše Re: řádky s max hodnotou
Omlouvám se za pozdní reakci, byl jsem mimo net. Ale to hlavní je, že tohle řešení mi dokonale splňuje požadavky.

Moc děkuji

Mike

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.