Oracle group by szeruseg kene nekem

Sziasztok!

A problemam a kovetkezo:
Van egy tablam amiben -csak a pelda kedveert- van egy elsodleges kulcs(id_primary), egy idegen kulcs(id_foreign), meg mondjuk egy datum(date). Szeretnem idegen kulcsonkent a legnagyobb datumu rekordot megkapni.Most ez igy megy:

SELECT *
FROM tabla t
,(SELECT MAX(DATE) DATE
,id_foreign
FROM tabla t
GROUP BY id_foreign) x
WHERE x.DATE = t.DATE AND
x.id_foreign = t.id_foreign

Az alselecttel levalogatom az id_foreign-ekhez tartozo max datumot, es mivel nekem id_primary kell, ezert megegyszer bekotom a tablat es osszekotom a datummal ill az id_foreign-nel.

De ez igy olyan gagyi megoldasnak tunik,azonkivul tobb buktatoja is van(nincs kitoltve datum, tobb datum is van ami ugyanakkora) szerintetek nincs erre valami megfelelo oracle beepitett fuggveny?

Elore is koszi a segitseget.

Hozzászólások

Szia,

Ha jól értettem, akkor ...


select t.id_primary,
t.id_foreign,
max(t.date) over(partition by t.id_foreign) as max_date
from tabla t

... ez így jó lesz Neked.

Az olyan típusú esetekre, amit írtál általában jók az analitikus függvények: http://psoug.org/reference/analytic_functions.html

Igen, ezt mar en is neztem, de ez szerintem nem jo, mert ez lehozza az osszes rekordot, csak a tenyleges datum helyett az adott id_foreign hez tartozo legnagyobb datumot irja. Nekem pedig nem kell az osszes rekord.

Tehat ha a tabla tartalma:

1 1 2009
2 1 2010
3 2 2004
4 2 2005

Akkor a te megoldasoddal ez jon le:

1 1 2010
2 1 2010
3 2 2005
4 2 2005

Az enyemmel viszont ez, es ezt is szeretnem:

2 1 2010
4 2 2005

Ezzel próbáld meg. Ez az analitikus fv beszámozza a sorokat id_foreign-en belül dátumcsökkenőben. Utána már csak le kell szűrni 1-re.

SELECT foreign_id, date from (
SELECT date, ROW_NUMBER() OVER (PARTITION BY id_foreign ORDER BY date DESC) sor
FROM tabla
)
WHERE sor = 1

igy lenne helyes:
SELECT sor, data from (
SELECT data, ROW_NUMBER() OVER (PARTITION BY id_foreign ORDER BY data DESC) sor
FROM huhu
)
WHERE sor = 1

vagy előzőek szerint:
SELECT t.id_foreign, max(t.date) FROM huhu t
WHERE t.DATe = (SELECT MAX(x.DATe) FROM huhu x
WHERE x.id_foreign = t.id_foreign
and nvl(x.DATe, 1900) <> 1900)
group by t.id_foreign
--ha nincs kitöltve dátum, több is van kezelésével