Hirdetés
- Toomy: FOXPOST: régen jó volt, de már jobban jársz, ha elfelejted
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- Luck Dragon: Asszociációs játék. :)
- Luck Dragon: Alza kuponok – aktuális kedvezmények, tippek és tapasztalatok (külön igényre)
- bambano: Bambanő háza tája
- Real Racing 3 - Freemium csoda
- sziku69: Szólánc.
- gerner1
- Pajac: Windows XP még mindig letölthető
Új hozzászólás Aktív témák
-
Apollo17hu
őstag
LAG() vagy LEAD() függvénnyel megképzel 7 extra mezőt, amik az előző, az azt megelőző stb. ... és végül a héttel korábbi fogadást tartalmazzák. Az így előállt 8 mezőt összeadod egy rekordon, és ahol 8-at kapsz, ott volt a nyolcas nyerő széria (vége).
-
Apollo17hu
őstag
válasz
hellsing71
#5581
üzenetére
igy esetleg?
select t.*
from tabla t
where case
when t.m1 = t.m2 then 1
when t.m1 = t.m3 then 1
when t.m1 = t.m4 then 1
when t.m2 = t.m3 then 1
when t.m2 = t.m4 then 1
when t.m3 = t.m4 then 1
end = 1 -
Apollo17hu
őstag
-
Apollo17hu
őstag
-
Apollo17hu
őstag
Sziasztok!
Van egy problémám, amire csak favágó megoldásom van, de érdekelne, hogy megoldható-e elegáns(abb)an.
Van egy tény tábla (t1), ami tartalmaz egy egyedi azonosítót (id), és további attribútum mezőket (m1, m2, m3 stb.).
Van egy dimenzió tábla (t2), ami a tény tábla rekordjainak besorolására szolgál. Ebben a dimenzió táblában megvan az összes attribútum mező (m1, m2, m3 stb.), ami t1-ben is szerepel, de itt id helyett egy ún. kategoria mező van. A kategoria mező szintén egyedi. Úgy áll elő, hogy a rekordon lévő attribútum mezőket egyszerűen konkatenáljuk.A feladat az, hogy t1 összes sorát meg kell nézni, hova kategorizálódik t2 szerint. A probléma ott kezdődik, hogy az attribútum mezők mindkét táblában hol töltöttek, hol nem (NULL). Értelemszerűen, ha t2-ben töltetlen egy attribútum, akkor az a kategorizálás szempontjából irreleváns (vagyis t1-ben bármit tartalmaz az attribútum, a rekord kötni fog t2-vel). ...és ott folytatódik, hogyha t2-ben bizonyos sorok "tartalmazzák" a másikat, akkor a szűkebb halmaz priorizált.
Például, ha az alábbi két rekord szerepel t2-ben:
m1 = NULL; m2 = 'Bela'; kategoria = Bela
m1 = 'Aladar'; m2 = 'Bela'; kategoria = AladarBela...akkor t1-ben az alábbi rekord:
id = 1; m1 = 'Aladar'; m2 = 'Bela'
az 'AladarBela' kategóriát fogja megkapni, mert ugyan 'Bela' kategória is érvényes lenne rá, de 'AladarBela' szűkebb halmazt képvisel (mert nem mindegy, mi kerül az m1 attribútumba).
Ha t1-ben ez a rekord lenne:
id = 2; m1 = 'Alfonz'; m2 = 'Bela'
...akkor a 'Bela' kategóriát kapná.
Látszik, hogy a kategorizálás egyértelmű, de nekem nem jut eszembe egyszerűbb megoldás annál, minthogy létrehozzak egy olyan CASE WHEN-t, aminek az ágainak számossága egyezik a t2 táblában lévő rekordok számosságával. És ez azért is gáz így, mert ha t2 bővül/módosul, akkor a CASE WHEN-t is bővíteni/módosítani kell.
DB Fiddle-ben készítettem két mintatáblát, ha vkit érdekel a problémafelvetés.
Köszi! -
Apollo17hu
őstag
Sziasztok!
Oracle SQL-ben van 3 táblám: "A", "B" és "C". "A" és "C" között "B" kapcsolótáblaként funkcionál. Szeretném megnézni, hogy
- Vannak-e olyan rekordok, amelyek megtalálhatóak "A"-ban, de nincs hozzájuk kapcsolat "B"-ben?
- Vannak-e olyan rekordok, amelyek megtalálhatóak "C"-ben, de nincs hozzájuk kapcsolat "B"-ben?
- Vannak-e olyan kapcsolatok "B"-ben, amelyek sem "A", sem "C" egyik elemére sem mutatnak?Egyelőre arra jutottam, hogy először csinálok egy ilyet:
"A" FULL OUTER JOIN "B",
majd a kapott halmazhoz hasonló módon hozzácsapom "C"-t:
("A" FULL OUTER JOIN "B") FULL OUTER JOIN "C".
Van ennek a mókának elegánsabb módja? Olyasmire gondolok, hogy lehet-e 3 (vagy több) táblát egy lépésben FULL OUTER JOIN kapcsolni?
-
Apollo17hu
őstag
Hat, azt nem tudom, hogy mi hogyan irodhatott, de abban nagyon igazad van, hogyha az ember nem gyakorlott benne, akkor elegge necces a hasznalata. Egy kivalasztott peldara meg nehany masodperc alatt lefutott a kodom, de szazmillios rekordszamom van, ugyhogy inkabb elengedem a rekurziv temat. Igazabol csak egy szep megoldast kerestem, mert mas modon kozel 100%-os pontossaggal meg tudom hatarozni az ertekeket - es szerencsere ez most eleg.
-
Apollo17hu
őstag
válasz
Apollo17hu
#5214
üzenetére
Többé-kevésbé sikerült összeraknom. Álljon itt az utókornak:
WITH t AS(SELECT t.id,t.ertek,row_number() over(ORDER BY t.id) AS seqnumFROM (SELECT 'A' AS "ID",-2 AS "ERTEK" FROM dualUNION ALLSELECT 'B',-5 FROM dualUNION ALLSELECT 'C',-1 FROM dualUNION ALLSELECT 'D', 3 FROM dualUNION ALLSELECT 'E',10 FROM dualUNION ALLSELECT 'F',-7 FROM dualUNION ALLSELECT 'G',-4 FROM dualUNION ALLSELECT 'H',20 FROM dualUNION ALLSELECT 'I',-1 FROM dualUNION ALLSELECT 'J',-3 FROM dual) t),cte(id,ertek,runningsum,seqnum) AS(SELECT ID,ertek,(CASEWHEN ertek > 0 THEN0ELSEertekEND) AS runningsum,seqnumFROM tWHERE t.seqnum = 1UNION ALLSELECT cte.id,t.ertek,(CASEWHEN t.ertek + cte.runningsum > 0 THEN0ELSEt.ertek + cte.runningsumEND) AS runningsum,t.seqnumFROM cteJOIN tON t.seqnum = cte.seqnum + 1/*AND t.id = cte.id*/)SELECT cte.ertek, cte.runningsum AS korr_ertekFROM cteORDER BY seqnum -
Apollo17hu
őstag
Sziasztok!
Kumulálás témában kérem a segítségetek. Pozitív és negatív egész számaim vannak egy mezőben. Egy másik mezőben azonosító szerepel, a rekordok e mentén vannak rendezve.
Az a feladat, hogy a számokat kumuláljuk, de a kumulált érték nem lehet magasabb nullánál. Tehát ha az aggregálás "átfordulna" a pozitív tartományba, akkor ott 0-nak kell szerepelnie.Így néz ki a modell, amiben a 3. oszlopot kellene létrehoznom:
ID ERTEK KORR_ERTEK
A -2 -2
B -5 -7
C -1 -8
D 3 -5
E 10 0
F -7 -7
G -4 -11
H 20 0
I -1 -1
J -3 -4
Sajnos sqlfiddle hibát dob, ezzel próbálkoztam:CREATE TABLE proba (id varchar2(10),ertek number);INSERT INTO proba([id], [ertek])VALUES('A',-2),('B',-5),('C',-1),('D',3),('E',10),('F',-7),('G',-4),('H',20),('I',-1),('J',-3);Milyen módon lehetne kiszámolni a KORR_ERTEK mezőt?
Maga a kumulálás ezzel működik, de a nullával való korrigálásra nem jöttem rá:
SUM(ertek) OVER(ORDER BY id) -
Apollo17hu
őstag
Sziasztok! MSSQL-ben hogy tudom kiszurni azokat a rekordokat, amelyek kirxkraxokat tartalmaznak egy mezoben? Tehat a mezob n levo ekezetes karakterek helyett ilyen tokomtudja karakterkeszlet karakterei jelennek meg.
Probaltam regexp kifejezessel (azAZ), de ugy ertelmezi, mintha ezek a speci karakterek is az abece reszei lennenek. Nincs vmi egyszeru tisztito fuggveny erre? -
Apollo17hu
őstag
Van esemény, szobaszám, kezdő és befejezési időpont. Eddig oké. De mi az a szint? Az is egy külön attribútum külön mezőben? Minden mező egy adattáblában van?
Vmi ilyesmire lesz szükséged, ahonnan a megképzett "sorrend" mezőnek veheted később a minimumát:
RANK() OVER(PARTITION BY szint ORDER BY kezdo_idopont) AS sorrend
Arra kell figyelni, hogy RANK() esetén több minimum is lehet, ha a sorrendiség nem egyértelmű. -
Apollo17hu
őstag
Olyan oldalt vagy esetleg egyetemi jegyzetet tudtok, ami viszonylag nehezebb sql-lekérdezési feladatokat/példákat tartalmaz? Elsősorban a táblakapcsolatok, többszörös JOIN-ok, egymásba ágyazások érdekelnének.
-
Apollo17hu
őstag
Transzponálhatod pl. PIVOT függvénnyel, vagy lekorlátozhatod az eredeti selectet úgy, hogy csak az egyik eredménysort adja vissza, aztán egy másik selectben pedig csak a másik eredménysort. Ha utóbbit választod, akkor mehet rá a Descartes-szorzat:
SELECT egyik.mezo AS mezo_1, masik.mezo AS mezo_2FROM (egyik_select) AS egyik, (masik_select) AS masik -
Apollo17hu
őstag
A LEAD függvénnyel olyan oszlop hozható létre, ami egy meglévő mező csoportosított/sorbarendezett értékeit eltolja.
tm5 megoldásában a halmaz nincs csoportosítva, csak ID alapján sorbarendezve. E szerint az ID és a DATUM mezőket egy rekorddal eltolva képzi meg a next_id és next_datum oszlopokat.Alapértelmezettként az eltolás mértéke 1, ekkor elhagyható.
A LEAD-hez hasonló még a LAG függvény, ahol az eltolás "ellenkező" irányba történik. -
Apollo17hu
őstag
-
Apollo17hu
őstag
Bocs, hogy beleszólok, de Lourohoz hasonló munkakörben dolgoztam, és csak megerősíteni tudom:
- High-level menedzsernek nem fogod tudni elmagyarázni. Nem érdeklik a részletek ilyen mélységben, és nem is akarja megérteni, mert nincs ideje rá. A közvetlen vezetődnek mondhatod, de ő nagyon jól tudja, hogy a nála nagyobb emberek az ilyesmit egyszerűen lesöprik az asztalról. Csak az eredmény számít.
- A másik dolog pedig az, hogy felsőbb szinten a vezetők hajlamosak (sőt, néha kötelező az előmenetel miatt) rotálni szervezeten belül. Tehát, ha 3-5 évig működik a toldozás-foldozás, akkor nyert ügye van, mert úgyis dobbant máshova....és ennek analógiájára: az a fejlesztő balek, aki próbál prudensen, hosszú távban gondolkodva végezni a dolgát. Ahhoz képest mindenképp, aki összehányja a munkát, de feleannyi idő alatt eredményt mutat fel, és 2-3 évente munkahelyet vált (aminek következményeként nem kell saját maga után takarítani).
-
Apollo17hu
őstag
Jaaa... Az szívás. Ahol én dolgoztam, ott a calendar tábla minden naptári napot tartalmazott talán 1900-tól 2040-ig. Külön flag volt a munkanapokra, hóvégekre, hét melyik napja, mi a köv. munkanap stb.
Szóval akkor egy ilyen segédtáblát kellene megképezni, és felhasználni ahhoz, amit fentebb írtam. Legyen mondjuk ez a calendar_2! Valahogy így állítanám elő calendar_2 -t:
1. Keresnék egy számláló táblát az adatbázisban, ami 0 és egy nagyon nagy szám között tartalmazza az egész számokat. (Ha nincs ilyen, akkor tetszőleges táblán row_number-t képeznék, és azt használnám.)
2. A számláló tábla rekordjaihoz megképezném a calendar_day mezőt, ami a naptári napokat tartalmazza. Az 1. naptári nap a bemenő dátum, az összes többi pedig ez a dátum növelve a számlálóban lévő értékkel (date_add, ha van ilyen postgresql-ben).
3. Szintén új mezőben megjelölném a szombatokat és vasárnapokat. (modulo 7 eredménye alapján)
4. A 2. pontban létrehozott listához gyengén (LEFT JOIN) hozzákötném a calendar táblát, amiben csak a rendkívüli munkarend napjai vannak benne.
5. A 3. és 4. pontban lévő információ felhasználásával létre lehetne hozni a végleges workday_fl mezőt.Így állna elő a calendar_2 halmaz, amiből calendar_day-t és workday_fl-et lehetne felhasználni a megoldáshoz.
-
Apollo17hu
őstag
válasz
bambano
#4461
üzenetére
Fognám a calendar táblát, raknék rá egy "nagyobb, mint a bemenő dátum" ÉS "legyen munkanap" szűrést, majd a kapott halmazon valamilyen rank() függvénnyel (van ilyen postgresql-ben?) egy sorszám mezőt generálnék, ami dátum szerint növekvő sorrendben osztaná ki a sorszámot. Ahol a sorszám n, az a keresett dátum.
Ehhez mondjuk az is kell, hogy az ünnepnapokból és a munkanap áthelyezésekből rendelkezésre álljon egy munkanap flag ['I', 'N'] is. Ha ilyen nincs, azt mondjuk egy CASE WHEN-nel külön le kell még kezelni.
-
Apollo17hu
őstag
sztem amit irtam, az teljesen jo neki, csak nem vette eszre
-
Apollo17hu
őstag
válasz
BuktaSzaki
#4422
üzenetére
Valahogy igy:
...
WHERE ...
AND CASE
WHEN tetel = 'egyik ertek' THEN 1
WHEN tetel = 'masik ertek' THEN 1
END = 1
... -
Apollo17hu
őstag
válasz
BuktaSzaki
#4399
üzenetére
Akkor, amit #4397 -ben írtál, az rendben van. Vagy nem értem. Példák kellenének.
-
Apollo17hu
őstag
válasz
BuktaSzaki
#4397
üzenetére
Pontosan mi a kodod? Nem lehet, hogy vannak olyan szolgaltatasok, amelyek - azon felul, hogy hibasan duplikalva vannak bizonyos szerzodesekhez - tobb szerzodeshez is kapcsolodnak?
-
Apollo17hu
őstag
válasz
BuktaSzaki
#4395
üzenetére
SELECT tabla.szerzszam, tabla.szolgazonFROM tablaGROUP BY tabla.szerzszam, tabla.szolgazonHAVING COUNT(*) > 1Ezzel azokat is megkapod, ha 2-nél többször van hozzárendelve ugyanaz a szolgáltatás.
-
Apollo17hu
őstag
Igen, fenn van az XE, és egyelőre a célnak megfelel. Köszönöm az eddigi segítséget mindenkinek, jövök még a topikba, ha elakadok.
-
Apollo17hu
őstag
Guglizás közben olvastam a container és a pluggable database-ről, de - ahogy írod is - fogalmam sem volt, hogy lehetne normálisan beállítani.
Nincs Linux ismeretem. Akkor azt mondod, hogyha XE helyett EE-t rakom fel, sokkal egyszerűbben hozzáférek majd a sample schema-khoz? Éjjel már ott tartottam, hogy a zippelt HR-sémát githubról töltöm le, csak az importálásnál megint falakba ütköztem.

-
Apollo17hu
őstag
Azért ez eléggé nem volt triviális, hogy először system-ként kell csatlakozni, majd azzal létrehozni egy felhasználót magamnak.
Rögtön két problémába is ütköztem: először nem engedett felhasználót létrehozni, mert valami prefix (C##) gondja volt. Erre ki kellett adnom egy ALTER SESSION utasítást, és így már lefutott a CREATE USER. Viszont azt sem tudtam, hogy ennek a felhasználónak külön dba jogokat is kell adnom, hogy csatlakozni tudjak vele. Most már szerencsére ez is rendben van.
Következő lépésként felkutatom a HR sémát, és utánajárok, hogy lehet felrakni, mert egyelőre ezzel is meg vagyok lőve.
-
Apollo17hu
őstag
Letöltöttem és telepítettem az Oracle XE-t. Eddig tényleg egyszerű volt. Néztem a tutorialban, hogy próbaként csatlakozni kéne a szerverhez. Ez sokadjára, de összejött a SYSTEM userrel. Mi a különbség SYS, SYSTEM és PDADMIN között? Van még ezeken kívül olyan user, amivel csatlakozni lehet? (újat még nem hoztam létre) Valami olyasmit is olvastam, hogy a Windows useremnek automatikusan létrehoz egy Oracle felhasználót, de azzal nem tudtam belépni.
Következő lépés az SQL Developer letöltése és beállítása, és onnantól már van egy barátságos környezetem, amiben mókolhatok?
-
Apollo17hu
őstag
Otthoni PC-re (Win10) milyen megoldást ajánlanátok, ha szeretnék egy saját adatbázist üzemeltetni? Egyelőre csak létrehoznék néhány táblát, amiket feltöltenék adatokkal, és lekérdezéseket írogatnék.
Melóban eddig Oracle adatbázissal dolgoztam PL/SQL Developer környezetben, de úgy láttam, hogy ezeknek legfeljebb 1 hónapos trial verziója érhető el.
Semmilyen tapasztalatom nincs szerver telepítésében, oktatóvideók linkjét is szívesen fogadom. -
Apollo17hu
őstag
Ha a lekerdezes WHERE zaradekaban szursz a kivalasztott hozzavalokra, az nem jo?
-
Apollo17hu
őstag
Szia! Oracle-ben, ha ket idopontot kivonsz egymasbol, akkor a napok szamat kapod kulonbsegkent tizedes szamkent. Ha minden feladat vegdatumabol kivonod a kezdo datumat, es osszeadod oket, akkor napokban kapod meg a kivant erteket. Ezt mar csak 1.440-nel (24*60) kell felszoroznod.
-
Apollo17hu
őstag
válasz
bambano
#4179
üzenetére
Nem, vagyis én próbálok mindig a legjobb tudásom szerint kódolni, de mezei kontrollerként nem értek az optimalizáláshoz. Egyébként azt a 20 darab allekérdezést össze tudnám gyúrni 5-6-ba, de akkor egy potenciális jövőbeli hibakeresés sokkal tovább tartana (nekem is, de méginkább olyasvalakinek, aki nem ismeri a kódot). Az én szemszögemből az lenne a legegyszerűbb, ha egy táblából tudnék leszedni mindent, de a mostani mókolás is azért kellett, mert nincs IT erőforrás a fejlesztésekre.
Szerencsére nem mind a 20 allekérdezés 800 soros, összesen "csak" 4.300 sorból áll a kód.

-
Apollo17hu
őstag
válasz
Apollo17hu
#4174
üzenetére
Kollégámmal közösen megoldottuk.
Volt egy sanda gyanúm, hogy az új allekérdezéseken belül kell keresni a hibát, és beigazolódott. Ezek az új allekérdezések egyenként kb. 800 sornyi programkódból állnak, rengeteg tábla és allekérdezés alkotja őket. Van egy nagyobb saját sémás tábla is, ami csak kiegészítő adatot tartalmaz. Ezt kommenteztem ki, és lefutott a teljes kód. Ezzel az infóval kollégám egy egyszerű use_hash hintet rakott oda, ahova kellett, és így a saját sémás táblával együtt is 4 percen belül fut a teljes kód.
Az a fura, hogy amíg a 800 soros allekérdezéseket külön-külön futtattuk, nem "borult meg" a végrehajtásuk, viszont a teljes kódban már igen.
-
Apollo17hu
őstag
válasz
bambano
#4171
üzenetére
Volt korábban ugyanezzel a kóddal memóriaprobléma, de az egyértelmű volt, mert 15 perc után hibaüzenettel leállt. Szerencsére rájöttünk az okára (kb. az volt, hogy a 20 allekérdezés miatt 3^20 szorzót kapott a memóriában elfoglalt mérete, de extra kötésekkel, ezt áthidaltuk).
Temp tábla sajnos nem játszik. Maga a keretrendszer úgy néz ki, hogy különálló sql-eket tárolunk, amelyeket egy alkalmazás minden nap meghív, lefuttat, az eredményt pedig Excelbe másolja. Nincs lehetőség egymásra épülő kódrészletek megadására.
@bpx: Jogos, fejből írtam, de élesben jó helyre raktam a hintet. Ezt a materialize-t még kipróbálom, mert tényleg annyira lenne csak szükség, hogy külön-külön meglegyen az allekérdezések eredménye, utána már 2 másodperc alatt kiszámolja.
-
Apollo17hu
őstag
Az a gond, hogy nem végtáblában van szükségem az eredményre, mert egy automatizmus a további feldolgozás során használja.
@bpx: Próbálkoztam a NO_MERGE hinttel, de egyelőre sikertelenül.

A kód egyébként kb. így néz ki:
WITH
t1 as (...),
t2 as (...),
...
t20 as (...)
SELECT ...
FROM /*+ no_merge (t1 t2 ... t20) */
t1,
t2,
...,
t20,
() as tx
WHERE
tx.mezo = t1.mezo(+) AND
tx.mezo = t2.mezo(+) AND
...
tx.mezo = t20.mezo(+)Próbáltam LEFT JOIN szintaxisra is átírni a (+) kötéseket, de az sem segített.
A WITH-del lehet probléma? Azt olvastam, hogy még segít is az optimizer-nek, mert a legtöbb esetben előbb külön-külön számítja ki a WITH-ben lévő allekérdezések eredményét, és csak utána használja őket.Hogy érthető legyen: mondjuk t3-at, t7-et és t8-at cseréltem ki. Külön-külön minden t tábla minimális idő alatt lefut, néhányszáz sort eredményeznek. Ha csak t3-at (vagy csak t7-et vagy csak t8-at) cserélem ki, akkor 1 perc alatt lefut a kód. Ha már két táblát is kicserélek, akkor nem.
Sőt, ha lebutítom így a kódot:WITH
t3 as (...),
t7 as (...)
SELECT ...
FROM
t3,
t7,
() as tx
WHERE
tx.mezo = t3.mezo(+) AND
tx.mezo = t7.mezo(+)már ez sem fut le. Tehát a 3 új allekérdezés valahogy "összeakad", pedig <1 perc a futási idejük külön-külön.
-
Apollo17hu
őstag
Nagy altalanossagban van megoldas (hinteles?) arra, ha van pl. 20 db allekerdezesem, ami egyenkent 200-300 rekordot ad vissza, kulon-kulon 1-60 masodpercig fut, de ha osszekotom oket (a megfelelo mezok menten), akkor elszall az egesz, es egy ora alatt sem fut le. Konkretan van egy ilyen, 5 percen belul futo monstre kodom, aminel 3 allekerdezest lecsereltem, es ez tortent vele. Sajnos plant nem tudok olvasni, ezert altalaban lenne jo vmi tipp, hogy merre induljak el.
Koszi! -
Apollo17hu
őstag
válasz
kw3v865
#4122
üzenetére
Így?
SELECT tabla.mezo
,substr(tabla.mezo, instr(tabla.mezo, '"ref"=>""') + length('"ref"=>""')) relevans_adattartalom
FROM (SELECT 'asfasf saf"ref"=>""ez kell' mezo
FROM dual
UNION
SELECT 'asfasf ssadfalksijdfkeefaf "ref"=>""ez is kell, de ez hosszabb' mezo
FROM dual) tablaSubstr utolsó paraméterét elhagyva a mező utolsó karakteréig mindent leválogat. Ha nem jó, akkor mindenképp kell egy ismérv/logika, ami meghatározza a releváns karaktersorozat végét.
-
Apollo17hu
őstag
válasz
kezdosql
#4112
üzenetére
Mindkét megoldásnak van létjogosultsága. A te verziód akkor lenne használható, ha minden egyes napra generálnál egy rekordot, ami a napra vonatkozó aktuális állapotot mutatja. Intervallumok használatával viszont egy csomó erőforrást megspórolsz. Csak akkor van szükség új rekordra, ha valamelyik mező adattartalmában változás történik.
-
Apollo17hu
őstag
válasz
user112
#4091
üzenetére
Ez a két módszer:
SELECT t.azon
,t.c1
,t.c2
,CASE
WHEN t.c2 ! = 0 THEN
t.c1 / t.c2
END AS arany
,CASE
WHEN t.c1 > 10 AND CASE
WHEN t.c2 ! = 0 THEN
t.c1 / t.c2
END > 50 THEN
'x'
END hiba
FROM (SELECT 'a' azon
,20 c1
,30 c2
FROM dual
UNION
SELECT 'b' azon
,20 c1
,0 c2
FROM dual
UNION
SELECT 'c' azon
,40 c1
,NULL c2
FROM dual
UNION
SELECT 'd' azon
,500 c1
,3 c2
FROM dual) tSELECT u.*
,CASE
WHEN u.c1 > 10 AND u.arany > 50 THEN
'x'
END hiba
FROM (SELECT t.azon
,t.c1
,t.c2
,CASE
WHEN t.c2 ! = 0 THEN
t.c1 / t.c2
END AS arany
FROM (SELECT 'a' azon
,20 c1
,30 c2
FROM dual
UNION
SELECT 'b' azon
,20 c1
,0 c2
FROM dual
UNION
SELECT 'c' azon
,40 c1
,NULL c2
FROM dual
UNION
SELECT 'd' azon
,500 c1
,3 c2
FROM dual) t) u -
Apollo17hu
őstag
válasz
user112
#4089
üzenetére
Bele tudod agyazni az arany case when-jet egy masik case when-be. Vagy fogod a lekerdezesed, allekerdezesbe rakod, es ennek az allekerdezesenek az arany mezojere szinten tudsz hivatkozni.
Ha osztassal generalsz uj mezot, akkor tanacsos kivetelkezelest is alkalmazni a nullaval valo osztas hibalehetosegenek elkerulese erdekeben.
-
Apollo17hu
őstag
válasz
kezdosql
#4068
üzenetére
Csinálhatod azt is, hogy mindent, de mindent egyetlen táblában tárolsz.
Esemény dátuma, szezon, esemény megnevezése, eseményhez kapcsolódó játékos, játékos csapata, játékos lábmérete stb. Minden rekord rengeteg attribútumot (mezőt) tartalmazna, de az adattáblára írt lekérdezések az elvárthoz képest sokkal lassabban futnának, mert a tábla nem lenne normalizált.
Normalizáláshoz adatmodellt kellene kialakítani, ami viszont nem ott kezdődik, hogy az egyes mezőknek megmondjuk az adattípusát. Hanem megnézzük, hogy az ismétlődő értékek közül melyeket lehet dimenziótáblában tárolni. Ilyenek pl.: [dátumok] tábla, [csapatok] tábla, [játékosok] tábla, és ezek kapcsolódhatnának a ténytábláddal, amiben ezekre a táblákra csak hivatkozol, nem tárolod a bennük lévő összes mezőt.
-
Apollo17hu
őstag
válasz
kezdosql
#4063
üzenetére
Csinalhatnal egy calendar tablat, amiben felveszed az osszes datumot. Teszel bele egy mezot, ami megmutatja, hogy az adott naptari nap melyik szezon.
Es lenne a tenytablad, amiben a konkrrt esemenyeket rogzited datumokkal. Ha rogzitettel egy esemenyt, akkor az esemeny datuma menten a calendar tablabol megtudod, hogy melyik szezont erinti.
-
Apollo17hu
őstag
válasz
mr.nagy
#3698
üzenetére
Szia!
Írtam a példádhoz egy favágó kódot. Legalábbis ha sql-ben kellene megoldani, akkor én úgy állnék neki, hogy meghatároznám a total igényt, az igénylők darabszámát, és ebből számolnék tovább.
Akkor nincs gond, ha az igény többszöröse a kiosztható értéknek, mert akkor egyszerűen a kiosztható értéket az igénylők számával kell leosztani, és minden igénylő ennyit fog kapni. (Ezt már nem kódoltam bele, de értelemszerűen 20 db CASE WHEN-ről lesz szó...)
Eddig írtam meg a kódot. Még megképeztem egy olyan mezőt, ami azt tartalmazza, hogy mennyi olyan kiosztható érték marad, amiből már csak 1-1 darabot lehet véletlenszerűen (vagy extra logikával?) odaadni az igénylőknek.
select case when alap.kioszthato >= alap.total then 'N' else 'I' end hiany_fl
,case when alap.kioszthato >= alap.total then null
when isnull(alap.darab, 0) = 0 then null
else floor(alap.kioszthato / alap.darab) end ennyire_kell_csokkenteni
,case when alap.kioszthato >= alap.total then 0
when isnull(alap.darab, 0) = 0 then null
else alap.kioszthato - floor(alap.kioszthato / alap.darab) * alap.darab end ennyi_szetosztando_marad
,alap.*
from
(SELECT P1+P2+P3+P4+P5+P6+P7+P8+P9+P10+P11+P12+P13+P14+P15+P16+P17+P18+P19+P20 as total
,case when P1= 0 then 0 else 1 end + case when P2= 0 then 0 else 1 end + case when P3= 0 then 0 else 1 end + case when P4= 0 then 0 else 1 end + case when P5= 0 then 0 else 1 end + case when P6= 0 then 0 else 1 end + case when P7= 0 then 0 else 1 end + case when P8= 0 then 0 else 1 end + case when P9= 0 then 0 else 1 end + case when P10= 0 then 0 else 1 end + case when P11= 0 then 0 else 1 end + case when P12= 0 then 0 else 1 end + case when P13= 0 then 0 else 1 end + case when P14= 0 then 0 else 1 end + case when P15= 0 then 0 else 1 end + case when P16= 0 then 0 else 1 end + case when P17= 0 then 0 else 1 end + case when P18= 0 then 0 else 1 end + case when P19= 0 then 0 else 1 end + case when P20= 0 then 0 else 1 end as darab
,t.*
FROM Teszts t) alap -
Apollo17hu
őstag
válasz
BeeGee2115
#3642
üzenetére
- tran.tranzakcio_ertekhelyett- nvl(tran.tranzakcio_ertek, 0)-t használj, és így nem fog "eltűnni" az egyenlegszerk.: Most olvasom, hogy közben magad is rájöttél a megoldásra.

-
Apollo17hu
őstag
válasz
BeeGee2115
#3640
üzenetére
kb. úgy, ahogy az előbb leírtam: a kettőből 1-1 allekérdezést csinálsz, és számlaszám mentén összekötöd őket, ill. a számlára aggregált allekérdezéshez "gyengén" kötöd a tranzakcióra aggregált allekérdezést (LEFT JOIN, ha a pluszjeles szintaktika nem működne)
-
Apollo17hu
őstag
válasz
BeeGee2115
#3638
üzenetére
Egy mintaadatbázis jól jönne sqlfiddle-ben. Addig is ezt értettem meg a leírtakból:
SELECT
szla.Számla,
szla.szamla_ertek - tran.tranzakcio_ertek
FROM
(SELECT Számla,
SUM(Összeg) AS szamla_ertek
FROM Adatok
GROUP BY Számla) szla
,(SELECT Tranzakció,
SUM(Összeg) AS tranzakcio_ertek
FROM Adatok
GROUP BY Tranzakció) tran
WHERE szla.Számla = tran.Tranzakció(+)Az lenne az elve, hogy külön-külön összesítjük a "Számla" és a "Tranzakció" mezőkben lévő összegeket, és ahol a "Számla" és a "Tranzakció" egyezik, ott a kettőt kivonjuk egymásból.
-
Apollo17hu
őstag
válasz
BeeGee2115
#3636
üzenetére
nem vagyok teljesen képben, de talán erre van szükséged:
SELECT szamla,
SUM(osszeg) - SUM(CASE WHEN tranzakcio IS NOT NULL then osszeg ELSE 0 END)
FROM adatok
GROUP BY szamla...ami - ha jól gondolom - egyenértékű ezzel (egyszerűen eldobjuk azokat a rekordokat, amelyek tranzakciót - is - jelölnek):
SELECT szamla,
SUM(osszeg)
FROM adatok
WHERE tranzakcio IS NULL
GROUP BY szamla -
Apollo17hu
őstag
válasz
BeeGee2115
#3634
üzenetére
Így?
SELECT szamla,
SUM(CASE WHEN osszeg > 0 then osszeg ELSE 0 END) pozitiv,
SUM(CASE WHEN osszeg < 0 then osszeg ELSE 0 END) negativ
FROM adatok
GROUP BY szamla -
Apollo17hu
őstag
válasz
Fundiego
#3567
üzenetére
Szélsőséges esetben előfordulhat olyan holtverseny is, ahol két versenyző az összes sportágat tekintve azonos helyezésekkel rendelkezik. Ekkor csak pénzfeldobás (--> random szám generálás) dönthet. Vagy létrehozol egy külön táblát, amiben a fair-play értékeket vezeted.

Visszatérve a problémádhoz talán megoldás lehetne, ha játékosonként a játékosok helyezéseit sorbarendezve, összefűzve letárolnád, és ennek a minimumát vennéd a helyezések minimuma helyett. Pl.:
egyik játékos helyezései:
1, 2, 2, 4, 5, 5, 5-->1224555másik játékos helyezései:
1, 2, 3, 3, 3, 3, 3-->1233333Oracle-ben ehhez a listagg() függvényt tudod használni. Valahogy így:
listagg(helyezes) WITHIN GROUP (ORDER BY helyezes) OVER (PARTITION BY jatekos) -
Apollo17hu
őstag
Szia!
Meg fogom nézni, hogy van-e lehetőség ilyen formára átírni. Igazából a két allekérdezésre úgy tekintettem, mintha logikailag "különállóak" lennének. Eddig úgy gondoltam, hogy a kód futása külön-külön megy végbe allekérdezéseken belül, és csak ezt követi a részeredmények összekapcsolása. Szándékosan így is írtam a legtöbb kódot, beszédes alias-t adva az allekérdezéseknek, hogy pl. hibakereséskor könnyebben értelmezhesse akár egy olyan személy is, aki először találkozik vele. Ezek szerint nagyon nem így működik...

-
Apollo17hu
őstag
Sziasztok!
Még nem volt időm minden választ megnézni, viszont -Zeratul- megoldása tökéletes (<1 sec lett a futási idő). Köszönöm szépen!
Később részletesen is átnézem, hogy tanuljak belőle. -
Apollo17hu
őstag
PL/SQL Developer 9.x-ről álltunk át a napokban 12-es verzióra. Valószínűleg ez lehet a probléma forrása (talán az üzemeltetés nem hangolta tökéletesre az adatbázis szervert?).
Plant nem tudok mutatni, a lekérdezés egyébként kb. így néz ki:
SELECT t1.mezo_1
,t1.mezo_2
FROM (SELECT t.id
,t.mezo_1
,t.mezo_2
FROM tabla_1 t
WHERE feltetel_1
AND feltetel_2
...
AND feltetel_n) t1
,(SELECT t.id
FROM tabla_2 t
WHERE feltetel_1
AND feltetel_2
...
AND feltetel_n) t2
WHERE t1.id = t2.idEz futott korábban 1 másodpercig, most meg 5-10 perc között. t1 és t2 allekérdezés is 200-300 eredménysort ad vissza (mindkettő dimenziótábla), külön-külön 1 másodpercen belül most is lefutnak. Mindkét táblában az id egyedi, szám formátumú.
Az a vicces, hogyha t1 allekérdezésben találomra kikommentezek egy szűrőfeltételt (az eredménysorok száma 10-15%-kal nő), akkor az egész lekérdezés ismét 1 másodpercen belül fut.
Legalapabb hintekkel próbálkoztam (use_hash, use_nl stb.), de igazából nem tudom, mikor mit kell használni. Tapasztalatból csak annyi van meg, hogy nagyméretű ténytáblák kötésénél 90%-ban csökkenti a futási időt a use_hash hint.
Tudom, hogy ez még mindig kevés, és hogy jobban kellene specifikálni a problémát, de a hét végére valószínűleg kapok segítséget munkatársaktól, tehát mindenképp meg fog oldódni a probléma, csak azt hittem, vannak általánosan alkalmazható hintelések.
-
Apollo17hu
őstag
Sziasztok!
Van két, 1 másodpercen belül futó lekérdezésem (néhány száz rekord). A kettő eredményét összekötve 5 percre növekszik a futási idő. Milyen hintet érdemes használnom?
-
Apollo17hu
őstag
Egy rövid topikösszefoglalóra lenne szükség, amiben egy link mutat az sql fiddle -re.
-
Apollo17hu
őstag
válasz
GreenIT
#3422
üzenetére
Az új tábla valahogy így nézhetne ki:
CEG_CIMEK: ceg_kod, szekhely_fl, cim, kezdo_datum, bef_datum
A szekhely_fl jelölné, hogy székhelyről ('I') vagy telephelyről ('N') van-e szó.
A cim mezőt megbonthatod további mezőkre (orszag, telepules, iranyitoszam stb.).Ha egy rekordban kell megjelenítened a cég adott napra lekért összes telephelyét, akkor arra pl. a LISTAGG függvényt lehet használni.
-
Apollo17hu
őstag
válasz
Dilikutya
#3418
üzenetére
Szerintem nem jó a táblaszerkezeted. Ez a "nagyon sok" mező "ki van forgatva", pedig meg lehetne oldani az egészet két mezővel: az egyik értéke a mostani mezőnév lehetne, a másik értéke pedig az, amire most is szűrsz.
Most így vannak az adataid:
[mező_1] | [mező_2] | [mező_3] | [mező_4] | [mező_5] | ... | [mező_n]
---------------------------------------------------------------------------------------------
'AA' 'BB' 'XX' 'YY' 'PP' 'MM' 'ZZ'
'ee' 'zz' 'bb' 'NN' 'PP' 'MM' 'ww'
'dd' 'UU' 'CC' 'tt' 'xx' 'AA' 'WW'helyette viszont lehetnének így is:
[mező_1] | [mező_2]
------------------------------
'mező_1' 'AA'
'mező_1' 'ee'
'mező_1' 'dd'
'mező_2' 'BB'
'mező_2' 'zz'
'mező_2' 'UU'
...
'mező_n' 'ZZ'
'mező_n' 'ww'
'mező_n' 'WW' -
Apollo17hu
őstag
Szerintem ketté kellene szedni az "azon" mezőt. Ha egyben marad, le kell vágni az első karaktert, és a mentén csoportosítani. Nem tudom ellenőrizni, hogy szintaktikailag helyes-e, de valahogy így nézne ki a sorszámozás:
SELECT rendeles.azon
,substr(rendeles.azon, 1, 1) ||
rank() over(PARTITION BY substr(rendeles.azon, 1, 1) ORDER BY rendeles.azon) +
CASE WHEN substr(rendeles.azon, 1, 1) = 'K'
THEN max_sorszam.max_k
WHEN substr(rendeles.azon, 1, 1) = 'L'
THEN max_sorszam.max_l
WHEN substr(rendeles.azon, 1, 1) = 'M'
THEN max_sorszam.max_m
END uj_azon
FROM rendeles
,(SELECT MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'K'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_k
,MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'L'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_l
,MAX(CASE WHEN substr(sorszam.azon,1, 1) = 'M'
THEN to_number(substr(sorszam.azon, 2)) END) AS max_m
FROM sorszam) max_sorszam -
Apollo17hu
őstag
válasz
Memphis
#3020
üzenetére
Excelben is lehet olyan felületet kialakítani, hogy a mezei user észre sem veszi, hogy Office-alkalmazásban van. Kell hozzá egy pofás template, űrlapismeretek, kis makrózás, és egyáltalán nem munkafüzetként fogsz tekinteni a fájlra. Persze egy ilyet normálisan megcsinálni napokba telik (bármilyen környezetben).
Új hozzászólás Aktív témák
- HIBÁTLAN iPhone 13 mini 128GB Pink -1 ÉV GARANCIA - Kártyafüggetlen, MS3840
- Bomba ár! Dell Precision 5530 - i7-8850H I 16GB I 512SSD I 15,6" FHD I P1000 I Cam I W11 I Gari!
- GYÖNYÖRŰ iPhone 12 64GB Black -1 ÉV GARANCIA - Kártyafüggetlen, MS3654
- MacBook felvásárlás!! MacBook, MacBook Air, MacBook Pro
- ÁRGARANCIA!Épített KomPhone i7 14700KF 32/64GB RAM RX 9070 XT 16GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopszaki Kft.
Város: Budapest
Köszi!





