Új hozzászólás Aktív témák
-
tm5
tag
válasz Apollo17hu #2925 üzenetére
Hát az exact match-eket ugye elég hamar megkaphatod, de közelítő összehasonlítások már más tészta. Az IBM pl. nagyon nagy összegért adja bérbe cégeknek azt a szoftverét ami ezt csinálja. De még e fölött is általában működdik egy emberi csoport aki, egy bizonyos % fölött kézzel dönti el, hogy match, false positive vagy false negative az egyezés.
Valszeg valmilyen szintű közelítést össze lehet rakni, A kérdés az az, hogy a business mennyire tolerálja, hogy ha a hibás matchelés miatt nem érik el az ügyfelet.
Pl. Váci u. az Váci utca vagy Váci út? -
tm5
tag
válasz pittbaba #2907 üzenetére
Bár látom, hogy ez egy régi feladvány, de mivel nem láttam rá megoldást azért így utólag csak javasolnék valamit:
Szóval minden ami a apro_category_customs-ből jönne azt 1 subquery-be menne amire rékerülne egy PIVOT.
Ez egy Oracle-s példa rá.Ennek illene sokkal gyorsabbnak lennie és a query is szebb lenne.
-
tm5
tag
válasz DopeBob #2939 üzenetére
A neten találtam, valszeg más szeparátorral is működhet, csak nem vagyok magam nagyon otthon a regexp-es kifejezésekben:
select REGEXP_SUBSTR(s, '[^.]+', 1, 1) a,
REGEXP_SUBSTR(s, '[^.]+', 1, 2) b,
REGEXP_SUBSTR(s, '[^.]+', 1, 3) c,
REGEXP_SUBSTR(s, '[^.]+', 1, 4) d
from (select 'hello.how.are.you' s from dual)[ Szerkesztve ]
-
tm5
tag
Én is LAG-gal csinálnám amire még lenne téve egy CASE WHEN, hogy
CASE
WHEN val = LAG(val) OVER ... THEN 0
ELSE 1
END xez menne egy subqueryben és erre már csak egy SUM(x) kell.
Nagyon szépen működik a LAG, nekem a multkor a legutolsó értékváltozás dátumát kellett meghatározni és így csináltam.
[ Szerkesztve ]
-
tm5
tag
Valójában nem értem, hogy niért lenne rá szükség. Van valami "zajos" elem valahol a két végpont közötti csatornában? Azért normálisan azt várnám el, hogy se az Oracle se az MSSQL ne torzítsa az adatot az átvitel során.
Egy dolog jut az eszembe ami problémát okozhat, az pedig az eltérő db character set encoding. Bár azért van az Oracle Gateway, hogy ezeket kezelje.
Én használtam Gateway-t bő 10 éve és ahogy emlékszem már akkor sem volt vele semmi gond.
Vagy az a gond, hogy valaki valahol belenyúlhat az adatokba?
-
tm5
tag
válasz lordring #2979 üzenetére
Szóval valami ilyennek kéne lenni:
SELECT
T0.[ItemCode], T0.[Dscription], T0.[Quantity], T0.[Price], T0.[Currency], T0.[LineTotal], T0.[TotalFrgn],
T2.[CardName], T0.[ShipDate], T1.[CardCode]
FROM CSI1 T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OCRD T2 ON T1.CardCode = T2.CardCode
WHERE
T0.[ShipDate] >=[%0]AND T0.[ShipDate] <=[%1] AND T2.CardName = '[%3]'
UNION ALL
SELECT
0,'Total:', SUM(LineTotal), SUM(TotalFrgn), NULL, NULL, NULL
FROM
(
SELECT
T0.[ItemCode], T0.[Dscription], T0.[Quantity], T0.[Price], T0.[Currency], T0.[LineTotal], T0.[TotalFrgn],
T2. [CardName], T0.[ShipDate], T1.[CardCode]
FROM CSI1 T0
INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OCRD T2 ON T1.CardCode = T2.CardCode
WHERE
T0.[ShipDate] >=[%0]AND T0.[ShipDate] <=[%1] AND T2.CardName = '[%3]'
)Mindamellett az a véleményem, általában a Total sort nem itt kéne számolni, hanem a kliens oldalt, hisz valszeg a megjelenítéskor úgyis másképp lesz formázva.
-
tm5
tag
válasz Peter Kiss #2981 üzenetére
jaja, abszolút egyetértek...
-
tm5
tag
válasz bambano #2987 üzenetére
select cc.szolgaltatas, COUNT(*)
from
(
select
customer_id,
row_number() over (partition by customer_id order by service_type_id) rnum,
case
when COUNT(*) over (partition by customer_id) = 2 then 'Mindketto'
when service_type_id = 11 then 'Internet'
when service_type_id = 13 then 'TV'
end szolgaltatas
from Table_1
) cc
where rnum=1
group by cc.szolgaltatasha egy sorba akarod az eredményt akkor viszont ahogy lejjebb írták, (SUM(DECODE...stb)), de a subquery ugyanaz.
-
tm5
tag
lehagytam egy záró zárójelet az NVL-es sor végéről, nem amiatt kapsz hibát? Mert amúgy szerintem ennek működnie kellene.
Amúgy nem lenne gond a mutatnál egy példát az adatokra, hogy mi van az egyes táblákban és hogy mi az elvárt select eredmény. 2 ember elég, egyiknél van kmh a másiknál nincs.
-
tm5
tag
válasz concret_hp #3091 üzenetére
Hát egyszer muszáj lesz végignyalni az alkérdést, hogy megtalálja a minimumot, de mondjuk talán a sort-ot meg tudod úszni:
Tedd bele az alkérdésbe 8. oszlopnak a következőt:
min(egyikmezo) over (partition by 1) as min_ertek
és akkor a fő select-ben beírhatod a where-be hogy:
alkerdes.egyikmezo = alkerdes.min_ertek
-
tm5
tag
válasz Ursache #3153 üzenetére
Hát inner join esetén csak azok a rekordok jönnek vissza amelyek mindkét táblában szerepelnek.
Szerintem inkább egy left outer join kellene ahol a baloldali tábla (a) olyan, hogy minden ügyfél benne van:SELECT *
FROM a
LEFT OUTER JOIN b ON (a.id = b.id)Ha pedig olyan a két tábla, hogy mindegyikben lehet olyan ügyfélrekord, ami nincs a másikban, akkor a LEFT helyére FULL-t kellene írni.
-
-
tm5
tag
válasz Petya25 #3201 üzenetére
Ajaj, akkor elég gyenge az a szerver... azért 2*600k-t joinolni nem kéne problémának lenni manapság.
Az a baj, hogy sortolni muszáj lesz, hogy ki tudd választani a dátum alapján az aktuális árat, Esetleg ha 2 dátum oszlop lett volna az ár táblában akkor egy "eladás_dátum beween tol and ig" kifejezéssel ki lehetett volna kapkodni a megfelelő sorokat sort nélkül is.[ Szerkesztve ]
-
tm5
tag
válasz tvse1995 #3351 üzenetére
esetleg így: (adatok nélkül nem tudtam kipróbálni, de így tünt a legszimpatikusabbnak)
Select legfi.berlo_kulcs,
legfi.nev,
legfi.szuletesi_ido,
jarmukolcsonzes.kolcsonzes_kulcs,
jarmukolcsonzes.kiadas,
jarmukolcsonzes.visszavetel,
jarmukolcsonzes.jarmu_kulcs,
jarmu.marka,
jarmu.tipus
From
(Select berlo_kulcs
From ( Select Rank() Over (Partition By berlo_kulcs Order By szuletesi_ido Desc) rn, berlo_kulcs From berlo) Where rn In (2,3)) legfi
,jarmukolcsonzes
,jarmu
Where legfi.berlo_kulcs = jarmukolcsonzes.berlo_kulcs(+)
And jarmu.jarmu_kulcs(+) = jarmukolcsonzes.jarmu_kulcs[ Szerkesztve ]
-
-
tm5
tag
válasz Apollo17hu #3451 üzenetére
Kb. fél éve nekem is volt egy ehhez nagyon hasonló problémám és ott is a 12c-re való átállás okozta a teljesítmény problémát.
Zeratul megoldása nekem is beugrott (mármint a hintek használata), csak nálunk az tilos és hozzá vagyok szokva, hogy ilyenkor át kell írnom a query-t.Amúgy ahol lehet én is szétszedem subquery-kre a feladatot, mert akkor magam is jobban értem, hogy mit csinálok. Elég sok 4-800 soros query-vel dolgozom, másképp nem is érteném meg őket
-
tm5
tag
Hát a WHERE feltételben az van, hogy minden olyan rekordra fusson le aminél a mező értéke '<s>'-sel kezdődik és '</s>' -re végződik.
A SET-nél az van, hogy vágja ki a két fenti markup közti részt és rakja '<int>' és '</int>' közé.
Tehát így transzformál (elvileg):
'<s>1</s>' -> '<int>1</int>'
'<s>12</s>' -> '<int>12</int>'
'<s>999</s>' -> '<int>999</int>'
stb.Ha esetleg más szerkezetű (is) a mező tartalma, amit konvertálni kell, akkor írj már rá, légy szíves, néhány példát és akkor átfogalmazzuk a parancsot.
-
tm5
tag
Érdekes, úgy rémlett, hogy később kijavítottam column_value-t SA.value-ra.
SUBSTR(sa.VALUE,4,LENGTH(sa.VALUE)-7)
: ide a 4 helyére azt kell írni, ahol kezdődik a tényleges érték. '<s>' ugye 3 karakter hosszú, tehát a negyedik karakternél fog kezdődni a tényleges mezőérték. A LENGTH(sa.VALUE)-7 megadja, hogy hány karakter hosszú a tényleges mezőérték. Ezt úgy kapjuk meg, hogy a mező teljes hosszából (LENGTH(sa.VALUE)) levonjuk a fölösleges rész hosszát. Ez a mi példánkban 7 volt, mert '<s>' és '</s>' összesen 7 karakter.Tehát ha a boolean-ből szeretnéd kibányászni a tényleges mezőértéket, akkor az így néz ki:
'<boolean>' hossza 9 (tehát a 10. karakteren fog kezdődni ami neked kell)
'</boolean>' hossza 10SUBSTR(sa.VALUE,10,LENGTH(sa.VALUE)-19)
[ Szerkesztve ]
-
tm5
tag
válasz BeeGee2115 #3632 üzenetére
Szerintem nem kell rögtön táblát léterhozni ehhez, mert akkor minden Adatok tábla módosítás (insert/update/delete) után frissítened kellene a Számlák táblát.
Bőven elég egy lekérdezés:SELECT szamla, SUM(osszeg)
FROM adatok
GROUP BY szamlaMondjuk ez negatívval nem tartalmazza azt amikor az egyik számláról mozog a pénz a másikra. Ahhoz az kellene, hogy hozz létre egy negatív sort a "from" számlához is amikor onnan átkerül pénz a másikra.
-
tm5
tag
válasz bambano #3645 üzenetére
Ezt sqlfiddleben raktam össze:
/*schema setup:*/
create table t1(c1 integer);
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);
insert into t1 values (4);
insert into t1 values (6);
insert into t1 values (7);
insert into t1 values (10);
insert into t1 values (11);
/*a query:*/
select * from (
select c1,
CASE
WHEN plus1 != kovetkezo THEN 'vegelem'
WHEN minus1 != elozo THEN 'kezdoelem'
WHEN elozo IS NULL THEN 'kezdoelem'
WHEN kovetkezo IS NULL THEN 'vegelem'
ELSE 'kozbulso'
END tipus
from
(select c1, c1-1 minus1, c1+1 plus1, lag(c1) over () elozo, lead(c1) over () kovetkezo from t1) t) tt
where tipus != 'kozbulso';ezután már csak egy pivot kéne, de arra már nem volt energiám
-
tm5
tag
válasz user112 #3784 üzenetére
Hát ennyi speckó alapján az alábbiak közül bármelyik jó lehet. Nem tudom melyik a preferált output neked:
-- egymas mellett
WITH sorsz8 AS (SELECT * FROM tabla WHERE SORSZ=8)
,sorsz12 AS (SELECT * FROM tabla WHERE SORSZ=12)
SELECT *
FROM sorsz8 a
LEFT OUTER JOIN sorsz12 b ON (a.azon = b.azon)
ORDER BY a.azon
-- egymas alatt
SELECT * FROM
(
SELECT * FROM tabla WHERE SORSZ=8
UNION
SELECT * FROM tabla WHERE SORSZ=12
)
ORDER BY azon, sorszIlletve az adatok (ismátlődések) ismeretében, esetleg UNION ALL a UNION helyett.
[ Szerkesztve ]
-
tm5
tag
válasz #74220800 #3890 üzenetére
Hát van MS SQL-ből és Oracle-ből is egy un. Express Edition ami ingyenes. Felrakod lokálisan magadnak és kész. De lehet, hogy ha csak egyszeübb dolgokat akarsz kipróbálni akkor az sql fiddle is elég neked.
[ Szerkesztve ]
-
tm5
tag
válasz Peter Kiss #3892 üzenetére
Így van, de ha még most ismerkedik az SQL-lel akkor az Express is bőven elég.
A Developer Edition lényegében egy ingyenes Enterprise Edition, szóval sok olyan dolgot is tartalmaz ami neki szerintem fölösleges.