Magamról

Saját fotó
Főiskolai, majd egyetemi diplomamunkáimtól kezdve világ életemben, adatok, adatbázisok, adattárházak (leginkább Oracle) környékén mozogtam. Mostanság adattárházasként, adatbányászként élem napjaimat.

2013. február 13., szerda

Egy Oracle-SQL demó-feladat


Imádom a tárgybeli műfajt, egy időben, még évekkel ezelött gyűjtöttem is őket, sőt még SQL szakmai-levlistára is igyekeztem megirogatni őket. És bizony jó régen volt már, hogy sikerült beleszaladnom ilyen demó-feladatba. Amiről csak beszélgetni sem triviális, hát még megcsinálni.

Eredetileg nem terveztem blogposztot írni róla, főleg, hogy a blogot alapvetően és elsősorban adatbányász-témáknak tartom fenn. De a 2001(?) óta létező SQL levlista-accountom rakoncátlankodik és nem enged be levelet róla, így mérgemben csak blogposztba írom meg az egészet. :)

Az alábbi feladat a "való világ"-ból vevődött, azaz nem szimpla konstruáló agymenés végterméke :o) -> egy durva reverse engine projekt indukálta.

A feladat lépésenként végrehajtva nyilván triviális, a kérdés az, hogy egyetlen SQL-ben megy-e? ;)

Táblák és mezők:

PARTNER(partner_id,partner_nev)

TRANZAKCIO_TIPUS(tranzakcio_tipus_id, tranzakcio_tipus_megnev) –41 rekord van benne

TRANZAKCIO(tranzakcio_id,partner_id,tranzakcio_tipus_id,tranzakcio_datum) –vannak további mezők is persze,csak első körben nem érdekesek.

Kapcsolatok:

PARTNER -< TRANZAKCIO – 1:N

TRANZAKCIO_TIPUS -< TRANZAKCIO – 1:N


1.Feladat:

Kell a TRANZAKCIO táblából olyan 41 rekord(~tranzakcio_id), hogy minden tranzakciótípust le kéne fedni egy tranzakció-rekorddal olymódon, hogy ->

(1) Legkevesebb partnerrel. A konkrét esetben a maximum, hogy egy partner 18 különböző tranzakciótípust tud lefedni. (Igazándiból ez a fontos kritérium.)

(2) Ha a maximumnál (18) két vagy több partner is lenne, akkor azt a partnert kell választani, akinek a legutolsó lefedésre kandidáló tranzakciója a legfrissebb/legkésőbbi dátumú.

(Ha úgy egyszerűbb lehet tetszőlegesen "ahogy esik úgy puffan" jeligével is választani közöttük)


2.Feladat(-nehezítés):

Kell a TRANZAKCIO táblából 41 rekord, azaz minden tranzakciótípust le kéne fedni egy tranzakció-rekorddal (tranzakcio_id) olymódon, hogy -> Azt a legfrissebb tranzakció-rekordot kell kiválasztani adott tranzakciotípushoz, ahol

(1) A legtöbb mező van kitöltve

(2) Különböző értékekkel (azaz rekordon belül például nem lehet két egyforma dátum).


Utóirat1: azt gondolom ezutóbbi már lépésenként sem triviális.

Utóirat2: 

Jövő évben lesz, hogy 20 éve SQL-ezem, de olyanra nem emlékszem, hogy 8 napig írtam volna egyetlen SQL-t.:o))

A minap ez is megesett: többszáz tábla több ezer mezőjéből kellett reverse engine-lnem 526 db (legértékesebb) mező üzleti töltési logikáját, úgy, hogy perdöntően se primary key, se foreign key nem volt (csak elvétve és véletlenszerűen), az egyedüli indulásnál megkapott segítségem egy bonyolult form-hierarchiával bíró képernyős alkalmazás volt, ahol egyetlen módosítás is nagyon hosszú idő volt (csak általa soha napján sem végeztem volna a feladattal, ha nem találok gyorsabb megoldás-megközelítést).

A végeredmény egy 132 KB-os 3.050 soros SQL lett, ami még gyenge tesztrendszeren is, sőt order by -jal visszaadta 39 sec alatt az összes adatot többszázezer rekordnál. Jó érzés volt látni munkám gyümölcsét, illetve látni az Oracle rdbms robosztusságát. :)

Nincsenek megjegyzések:

Megjegyzés küldése