Select sql vybrat nejvetsi datum pro nektere vety

19 views
Skip to first unread message

Tomáš Kurek

unread,
Jan 10, 2020, 10:25:54 PM1/10/20
to Konference foxpro Google, fireb...@googlegroups.com
Ahoj. Potřebuji utvořit SQL dotaz který by mi vybral z této tabulky věty
pro každý vyznam ID_PRS dle toho kde je nejvyšší DATUM_OD . Někde jsem
to už nějak dělal ale nemůžu si vzpomenout jak na to. Když by náhodou
byly stejné datumy tak vzít první řádek.

SELECT ssr.id , ssr.ID_PRS , coalesce(ssr.DATUM_od , CAST ('01.01.1900'
as date)) as datum_od , ssr.ID_UCET
from TA_MZD_STAB_SR ssr
join TA_MZD_CD_SRA csr ON csr.id = ssr.ID_CSRA
WHERE  (ssr.ID_UCET is not null) AND csr.typ = 4
ORDER BY ID_PRS , DATUM_OD DESC

vyleze :

id    ID_PRS    datum_od    ID_UCET

753    1        01.05.2016    37414
695    1        01.05.2015    30352
623    2        01.05.2014    23678
2        2        01.01.1900    6
4        3        01.01.1900    8
7        4        01.01.1900    14
9        5        01.01.1900    16
218    6       01.01.1900    913
912    7       01.01.2018    50735
501    7       01.01.1900    5541
........

potřebuji výsledek :

id    ID_PRS    datum_od    ID_UCET

753    1    01.05.2016    37414
623    2    01.05.2014    23678
4        3    01.01.1900    8
7        4    01.01.1900    14
9        5    01.01.1900    16
218    6    01.01.1900    913
912    7    01.01.2018    50735
............
Potřebuji to na straně sql dotazu proto že bude sloužit jako vnitřní
select jinému selectu. Dík za nakopnutí. Už bádám 1 h a nic mě nenapadá.
z výsledku potřebuji použít ID_UCET.

-- Tomáš Kurek

Radomir Muras

unread,
Jan 11, 2020, 12:48:51 AM1/11/20
to fireb...@googlegroups.com
ZDravim.

Zkus to s vyuzitim Max(datum_od).

nějak tak:

SELECT ssr.id , ssr.ID_PRS , Max(DATUM_od ),  ssr.ID_UCET
from TA_MZD_STAB_SR ssr
join TA_MZD_CD_SRA csr ON csr.id = ssr.ID_CSRA    -- nechapu nač join, ale to uz je asi mimo rámec dotazu...

WHERE  (ssr.ID_UCET is not null) AND csr.typ = 4
ORDER BY ID_PRS , DATUM_OD DESC 

R.M. 



so 11. 1. 2020 v 4:25 odesílatel Tomáš Kurek <tomas...@volny.cz> napsal:
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny Firebird (CZ) ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu firebird_cz...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/firebird_cz/06aec330-7b3a-aa9f-4a3c-906fee0d65a3%40volny.cz.

Radomir Muras

unread,
Jan 11, 2020, 7:28:16 AM1/11/20
to fireb...@googlegroups.com
Mam lepší řešení (odzkoušené na podobné tab)
SELECT ssr.id , ssr.ID_PRS , Max(DATUM_od ),  ssr.ID_UCET
from TA_MZD_STAB_SR  SR ssr
join TA_MZD_CD_SRA csr ON csr.id = ssr.ID_CSRA
group by ssr.ID_PRS

group by seskupí řádky ID_PRS a z nich vybere max(dtm)

so 11. 1. 2020 v 6:48 odesílatel Radomir Muras <mur...@gmail.com> napsal:

Tomáš Kurek

unread,
Jan 11, 2020, 7:38:47 AM1/11/20
to fireb...@googlegroups.com

Dík za rady

Podle mě by to házelo asi chybu proto že group by musí zahrnovat vše jiné co není v agregační fci a já právě potřebuji dostávat id_ucet. Ale už jsem pořešil když mi poradili použít inner join.

SELECT aa.*
FROM (

    SELECT ssr.id , ssr.ID_PRS , coalesce(ssr.DATUM_od , CAST ('01.01.1900' as date)) as datum_od , ssr.ID_UCET
        from TA_MZD_STAB_SR ssr
        join TA_MZD_CD_SRA csr ON csr.id = ssr.ID_CSRA
        WHERE  (ssr.ID_UCET is not null) AND csr.typ = 4

        ORDER BY ID_PRS , DATUM_OD DESC) aa

    inner join (
        SELECT  ssr1.ID_PRS , MAX(coalesce(ssr1.DATUM_od , CAST ('01.01.1900'as date))) as datum_od
        from TA_MZD_STAB_SR ssr1
        join TA_MZD_CD_SRA csr1 ON csr1.id = ssr1.ID_CSRA
        WHERE  (ssr1.ID_UCET is not null) AND csr1.typ = 4
        GROUP BY ssr1.ID_PRS
        ) ab  on aa.ID_PRS = ab.ID_PRS AND aa.datum_od = ab.datum_od

řešení sice není ideální ale na těch datechy by mělo být ok

Tomáš Kurek
Dne 11.1.2020 v 13:28 Radomir Muras napsal(a):
Reply all
Reply to author
Forward
0 new messages