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.
- 1826 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
up
- A hozzászóláshoz be kell jelentkezni
SELECT * FROM tabla t
WHERE t.DATE = (SELECT MAX(x.DATE) FROM tabla x
WHERE x.id_foreign = t.id_foreign)
?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Mindenkinek koszonom a segitseget, ez a row_number() -es megoldas tokeletesen megfelel a celjaimnak.
Koszi!
- A hozzászóláshoz be kell jelentkezni