Új hozzászólás Aktív témák
-
tm5
tag
válasz
Jim Tonic
#5856
üzenetére
SELECT ceg, adoszam, datum
FROM
(SELECT ceg, adoszam, datum,
ROW_NUMBER() OVER (PARTITTION BY ceg ORDER BY datum DESC) rnum
FROM Table) x
WHERE rnum = 1UPDATE T -- nem emlékszem, hogy kell-e ide az alias
SET Ref = 1
FROM Tabla T
JOIN (SELECT ceg, adoszam, datum
FROM
(SELECT ceg, adoszam, datum,
ROW_NUMBER() OVER (PARTITTION BY ceg ORDER BY datum DESC) rnum
FROM Table) x
WHERE rnum = 1 ) jo ON T.ceg = jo.ceg AND T.adoszam = jo.adoszam AND t.datum = jo.datum
Némileg egyszerübb lenne a JOIN ha lenne egy ID oszlopa is a táblának. -
nyunyu
félisten
válasz
Jim Tonic
#4548
üzenetére
Ja tényleg, ablakozó függvényekkel lehet, hogy egyszerűbb, mivel ott összetett rendezést is tudsz alkalmazni:
select
p.product,
p.price
from products p
join (select
p1.product,
nvl(p2.valid_from, to_date('0000-01-01')) valid_from,
nvl(p1.valid_to, to_date('9999-12-31')) valid_to,
row_number() over (partition by p1.product
order by nvl(p2.valid_from, to_date('0000-01-01')) desc,
nvl(p1.valid_to, to_date('9999-12-31')) asc) rn
from products p1) b
on b.product = p.product
and b.valid_from = nvl(p.valid_from, to_date('0000-01-01'))
and b.valid_to = nvl(p.valid_to, to_date('9999-12-31'))
and b.rn = 1;Ezzel sorszámozod az egy termék rekordjait kezdő dátum szerint csökkenő és azon belül érvényességi dátum szerint növekvő sorrendben, majd veszed a legelső rekordot minden termékhez.
-
nyunyu
félisten
válasz
Jim Tonic
#4545
üzenetére
Ezeket egy selectben nem tudod összeszedni, mivel az oszlopfüggvények egymástól függetlenül értékelődnek ki.
Tehát nem max(valid_from)-hoz tartozó min(valid_to) értéket kapod vissza, hanem a globálisat.Maximum azt tudod tenni, hogy egy belső selectben leválogatod a max(valid_from)-okat minden termékhez, majd az a köré írt másik selectben kiveszed a min(valid_to)-t.
Valahogy így:
select product,
price
from products p
join (select
p1.product,
a.max_valid_from,
min(nvl(p1.valid_to, to_date('9999-12-31'))) min_valid_to
from products p1
join (select p2.product,
max(nvl(p2.valid_from, to_date('0000-01-01'))) max_valid_to
from products p2
group by p2.product) a
on a.product = p1.product
and a.max_valid_from = p1.valid_from
group by p1.product, a.max_valid_from) b
on b.product = p.product
and b.max_valid_from = nvl(p.valid_from, to_date('0000-01-01'))
and b.min_valid_to = nvl(p.valid_to, to_date('9999-12-31'));Oszlopfüggvények alapból figyelmen kívül hagyják a nullokat!
-
Apollo17hu
őstag
-
martonx
veterán
válasz
Jim Tonic
#3033
üzenetére
Szerintem ebben az esetben egy teljesen sima tárolt eljárás lenne a megoldás, persze trigger-rel is meg lehet csinálni csak nem elegáns, a triggereket érdemes kerülni, amennyire lehet.
Azaz a sima insert-ed helyett, amit egy trigger figyel, írsz egy tárolt eljárást, annak átadod a paramétereket, és az magán belül intézi az insert-et, kikeresést, és ha kell a másik táblába insert-et.
-
rum-cajsz
őstag
válasz
Jim Tonic
#3033
üzenetére
Igen, értettem én, ezért írtam a kiegészítést alulra. Tehát a select lehet ilyen is:
SELECT new.rendszám,new.autószíne, new.autótípusa from TABLE_B where table_b.rendszem=new.rendszam;
Persze ehhez az kell, hogy a TABLE_B lekérdezés eredménye csak egy sor legyen, tehát a lekérdezésed úgy kell paraméterezni, hogy a végén egy sor legyen a lekérdezés eredménye.
-
rum-cajsz
őstag
válasz
Jim Tonic
#3031
üzenetére
Ha igazán szép megoldást akarsz, akkor készítesz egy tárolt eljárást, aminek a paramétere a vizsgálandó adat. Tartalma pedig egy insert-select Utána az after triggerben meghívod ezt a programot, amikor szükséges. De az insert-select mehet közvetlenül a trigger kódjába is. pl. az ID egy oszlopa a tábla1 tábládnak.
create trigger sajáttrigger
active after insert or update
on tábla1
as
begin
insert into tábla3 (number, name)
select number, name from tábla2 where Accepted = new.id;
endErre gondoltál?
szerk:
Ja most látom, hogy az 1-es táblából akarsz értéket tenni bele, akkor úgy kell az oszlopokra hivatkoznod, hogy new.oszlopnév ez annak a táblának az oszlopa, ahová most éppen be akarsz szúrni, vagy módosítasz.
Új hozzászólás Aktív témák
- G.SKILL Trident Z RGB 16GB (2x8GB) 3000MHz DDR4 kit / BESZÁMÍTÁS OK!
- Apple iPhone 12 64GB 100% Akku Újszerű,Dobozos,Tartozékaival. 1 Év Garanciával!
- Kingston HyperX Fury 2x4GB 1600MHz DDR3 kit
- Honor 400 Lite 8/256GB Újszerű,Kártyafüggetlen,Tartozékaival. 1 Év Garanciával!
- Samsung Galaxy S24 8/128GB Újszerű,Kártyafüggetlen,Tartozékaival. 1 Év Garanciával!
- BESZÁMÍTÁS! Akár részletfizetés 0% THM ÚJ Intel LGA 1700 processzorok 3 év garanciával 27% áfaval
- Új és régi konzolok Okosítása és Szoftveres szintű javítása - MÁR 13.00-S PS4 IS!
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5070 12GB GAMER PC termékbeszámítással
- GYÖNYÖRŰ iPhone SE 2020 64GB Red -1 ÉV GARANCIA - Kártyafüggetlen, MS4527, 100% Akksi
- Samsung Galaxy S23 Ultra 256GB,Használt,Adatkabel,12 hónap garanciával
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


