Hirdetés

2024. június 10., hétfő

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)

Hozzászólások

(#5901) bambano válasza nyunyu (#5900) üzenetére


bambano
titán

én is megcsináltam, még éjjel :)

with naptar as (
select napok,
(case when date_part('dow',napok) between 1 and 5 then 1 else 0 end)::integer
*
(case when calendar.date is null then 1 else 0 end)::integer as isworkday
from
generate_series(now()::date,now()::date+'60 days'::interval,'1 day'::interval) as napok
left outer join
calendar on napok=calendar.date)
select napok::date,-1+sum(isworkday) over (order by napok) as workdays
from naptar where isworkday=1;

kb. ennyi az alap, ebből lehet közvetlen lekérdezést csinálni vagy window funkcióval és rownumberrel, vagy én csináltam belőle egy view-t és abból közvetlenül lehet selectelni.

egy rakás lehetséges optimalizáció még van benne, például a két case helyett lehetne egyet, stb.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5902) bambano


bambano
titán

egyébként a PostgreSQL úgy alakult ki anno, hogy az Ingresből fejlesztették tovább, Postgres néven. Amikor a korábbi lekérdező nyelvét lecserélték szabvány sql-re, akkor átnevezték a projektet Postgresql-re és maradt a rövid neve postgres.

A Postgre az nem hivatalos neve.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5903) Tothg86


Tothg86
tag

Sziasztok!
Egy kis segítséget szeretnék kérni. Nemrég kezdtem Hibernate-el dolgozni, és kissé elakadtam, szeretnék egy kis segítséget.
Van egy munkahelyi tábla, amiben nincsen auto increment ID, nincs semmilyen primary key sem. Szembesültem azzal (ha jól értem), hogy a hibernate megköveteli az egyértelmű azonosítást. Mivel nincs a táblában ID, ezért egy darab azonosítót nem tudok hozzárendelni. Olvastam, hogy van lehetőség összetett kulcs hozzárendélésére az EmbeddedID annotation-nel.
Jól értem? Egy netes példában az volt, hogy egy külön osztályt hozok létre a kulcsnak, és itt jelölöm, hogy @Embeddable. De ez már beleszámít a mappingbe?
Köszi, ha tudtok segíteni ebben

(#5904) Lokids


Lokids
addikt

Sziasztok!

Hogyan tudom megcsinálni azt, hogy 1 sorban jelenjen meg az alábbi a korábbi dátummal.
ID Kezdés
1 2020.01.01
1 2020.02.01

Akkor csak ez jelenjen meg:
1 2020.01.01

If you chase two rabbits you will lose them both.

(#5905) nyunyu válasza Lokids (#5904) üzenetére


nyunyu
félisten

ID szerint csoportosítod, és veszed a kezdes minimumát:
select id, min(kezdes)
from tabla
group by id;

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5906) coco2 válasza bambano (#5897) üzenetére


coco2
őstag

Ha 60 nappal előre mindig meg kell adni, mi lesz munkanap, és mi nem, amin utólag nem változtathatnak, és határidőt soha sem kell 60 napra előre számolni, akkor létezik logikus megoldás. Hanem azt korábban nem írtad, és nekem nincsen ismeretem a kérdéses környezet ügyintézésében. Mint ahogy abban sem, létezik-e 60 napon túli határidő? Ha igen, megint csak baj van.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#5907) Lokids válasza nyunyu (#5905) üzenetére


Lokids
addikt

Köszi.
Nem értem. Ezt próbáltam és hibát dobott a groub by-ra.
Most megint megcsináltam és jó.

If you chase two rabbits you will lose them both.

(#5909) nyunyu válasza #79484416 (#5908) üzenetére


nyunyu
félisten

Szintaktikai hibát :DDD

Hello IT! Have you tried turning it off and on again?

(#5910) Lokids válasza nyunyu (#5909) üzenetére


Lokids
addikt

Nem. De rájöttem, mit rontottam el.
Amikor alapból felveszem a mezőt akkor reklamál, hogy tegyem be valami agrregálásba vagy groupba is. A MIN ezt megoldja. De ha benn hagyom akkor továbbra is 2 sorban jeleníti meg.
Szóval jó volt elsőre is, csak ki kellett volna törölnöm a Group by-ból a mezőt.

If you chase two rabbits you will lose them both.

(#5911) nyunyu válasza Lokids (#5910) üzenetére


nyunyu
félisten

Ha valami(ke)t aggregálni szeretnél, akkor a group by-nál fel kell sorolnod minden olyan mezőt, ami a selectnél fel van sorolva és NEM számított mező.
Aggregálandó mezőket viszont nem szabad beírni a group by-hoz.

Persze lehetne ablakozó függvényekkel bonyolítani a történetet, hogy ne kelljen group by, de úgy kétszer olyan hosszú lenne a kód, és nehezebb megérteni, mit csinál :DDD
select id, kezdes
from (
select id, kezdes, row_number() over (partition by id order by kezdes asc) rn
from tabla)
where rn = 1;

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5912) bambano válasza Tothg86 (#5903) üzenetére


bambano
titán

ez ugyan nem hibernate topic, de ha nincs egyértelmű kulcs, akkor legyen.

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5913) Tothg86 válasza bambano (#5912) üzenetére


Tothg86
tag

Oh, nem gondoltam, hogy van hibernate topic

(#5914) F1DO


F1DO
senior tag

Sziasztok!

Van egy jelenség ami előtt értetlenül állok. Nem tisztán SQL kérdés, de a forrás onnan származik.
MS SQL Management studio-ban futtatok egy sima select query-t.
Lejön az eredmény, az eredmény ablakban ahol a rekordok vannak bal felső sarokra rákattintok - kijelölődik az egész táblázat.
Majd jobb egér gomb katt-ra elöjövő menüből a - Copy with Headers-re kattintok.
Nyitok egy új üres excel táblázatot és bemásolnám de nem viszi át az összes sort!
Pl az eredmény rekordok száma 1245 a 'Paste' után az excel munkalapon meg 968 sor van.
Ez hogy lehet? Min megy félre a beillesztés?

HA mondjuk Save results As.. ra kattintok és .csv-ben exportálom az eredményt akkor átmegy minden rekord, csak ilyenkor a fejléc marad le.

Dolgozom excellel, makrózok is benne stb. Észrevettem már hogy ha A oszlopban nincs érték akkor bizonyos műveleteknél hajlamos figyelmen kívül hagyni azt az egész sort, hiába van adat mondjuk B oszloptól. De most ez sem áll fenn, minden A oszlopban van értelmes adat.

[ Szerkesztve ]

(#5915) pch válasza F1DO (#5914) üzenetére


pch
aktív tag

Rakj fel egy libreoffice-t.

http://sb-soft.hu - "A" számlázó

(#5916) Dolby válasza F1DO (#5914) üzenetére


Dolby
senior tag

Nem az a helyzet, hogy csak az aktuálisan látszó rekordokat másolja? Szokott lenni gomb amivel a query összes eredményét meg lehet jeleníteni, utána másolj. (Ha még aktuális esetleg)

- Nyugalom, a hosszú élet ritka!

(#5917) nyunyu válasza F1DO (#5914) üzenetére


nyunyu
félisten

Nem lehet, hogy az Excel ODBC drivere kavar be?

Nálam Oracle SQL Developerrel is az a helyzet, hogy ha jobb klikk, save as-szel rákattintok az eredményhalmazra, és excel van kiválasztva, akkor egyszerűen megáll, amint eléri a fájlméret a 3MB-t.

Múltkor 3-4 napig vertem szemmel egy 17 ezer soros excelt, mire rájöttem, hogy igazából 25 ezer sort kellett volna átnéznem :W

Azóta csak csv-be mentek.

Hello IT! Have you tried turning it off and on again?

(#5918) DeFranco válasza nyunyu (#5917) üzenetére


DeFranco
nagyúr

Érdekes, nálam nincs ilyen probléma a developerben, igaz én "export"-ot használok, nem tudom, hogy a "save as" alatt ezt értetted-e.

(#5919) F1DO válasza nyunyu (#5917) üzenetére


F1DO
senior tag

Most hogy mondod..
Lehet hogy itt lesz a kutya elásva, vagy valahol itt. Ugyanis vagy 2 hete befrissítettem az MS SQL Enterp. Managert és kiakadt az excel importálásakor (itt visszafele volt a művelet) valamilyen "Microsoft.ACE.OLEDB.16.0 szolgáltató nincs bejegyezve a helyi gépen" hibaüzenettel visszadobta az importálást. Akkor valahogy - már nem emlékszem pontosan - 'bebikáztam' egy kiegészítő driver telepítéssel, de nem teljesen tiszta a dolog, olyan értelmezésben hogy nem volt időm bogarászni mi is a megoldás pontosan és mit csinál, melóban pörgés van ugye, örülsz ha tudsz tovább haladni. (Az importálás excelből MS SQL-be megoldódott és az elmúlt vagy 15 évben - azóta csinálom ezt - nem volt ilyesmire példa, hogy az SQL-ből az EXcelbe nem viszi át az összes rekordot - avagy nem futottam bele ilyesmibe!!!!!)

Korábban nem volt ilyen probléma, a copy with headers átvitte az összes eredmény sort.

[ Szerkesztve ]

(#5920) nyunyu


nyunyu
félisten

Adott egy ilyen query
update hiteligenylesek
set torolt = 1
where (foszamla, alszamla) in
(select foszamla, alszamla
from hiteligenylesek h
left join torolt_igenylesek t
on t.foszamla = h.foszamla
and t.alszamla = h.alszamla
left join aktiv_igenylesek a
on a.foszamla = h.foszamla
and a.alszamla = h.alszamla
where h.torolt = 0
and t.torlesi_datum is not null
and a.foszamla is null);

Hiteligenylesek táblában vannak a hitelek adatai, torolt_igenylesek és aktiv_igénylesek táblákba be lett importálva a számlavezető rendszer már törölt és aktív állománya január végéig. (torlesi_datum <= január 31)

Ehhez képest az Oracle valahogy teret váltott, és a február 29-én létrejött igényléseket is töröltre állította, pedig az azonosítóik sem a torolt_igenylesek, sem az aktiv_igenylesek táblában nem szerepelnek :W
(torolt flagjük meg nyilvánvalóan 0, hiszen a query futtatása előtti napokban jöttek létre.)

Még mindig nem értem, a nincs találat hogyan felel meg az is not null feltételnek. :(

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5921) bambano válasza nyunyu (#5920) üzenetére


bambano
titán

nem kellene hisztiznie, hogy a select foszamla,alszamla részben a főszámla és az alszámla melyik táblából van?

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5922) nyunyu válasza bambano (#5921) üzenetére


nyunyu
félisten

De kéne.

Eredeti DBben nem ugyanúgy hívják a hiteligenylesek meg a másik rendszerből származó táblákban a számlaszámos mezőket, így nem akadt fenn azon az Oracle, hogy elfelejtettem táblaaliast írni a select oszlopai elé, mivel egyértelmű volt, hogy melyik táblából jön.

Csak itt a szemléltetés kedvéért olvashatóbbá egyszerűsítettem a kódot, és nem követtetem a DBnk örökölt hülyeségeit, hogy minden táblában másképp hívják ugyanazokat a mezőket, aszerint, hogy ki mikor/hogyan specifikálta. :W

Pl. createdate vs create_date még az egyszerűbbik eset...

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5923) nyunyu válasza nyunyu (#5920) üzenetére


nyunyu
félisten

Ehh, and t.torlesi_datum is not null helyett and t.torlesi_datum > h.letrehozasi_datum kellett volna, és akkor biztosan nem nyírom ki a rossz ideiglenes számlaszámon létrejött friss igényléseket.
(Véglegeset 1 munkanappal később kaptak volna a számlavezető rendszertől, ami biztosan különböző lett volna a korábbiaktól.)

Asszem felírhatom a kéménybe korommal, hogy ez az n+1-edik módszer, ahogy a rendszerünk képes elkefélni az adatokat.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5924) bambano válasza nyunyu (#5923) üzenetére


bambano
titán

szóval az adatbáziskezelő megint az utasításaid szerint működött?
;]

Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis

(#5925) nyunyu válasza bambano (#5924) üzenetére


nyunyu
félisten

Az a bajom, hogy túlzottan alulnézetből látom az adatokat, és nem mindig ismer(het)em a keletkezésük, elromlásuk pontos körülményeit a különböző rendszerek közti adatszinkronizációk útvesztőjében, viszont nekem kéne helyrekalapálni a félreálló biteket.

Bár elnézve azt,hogy ~3500 GDPR érett igénylést akartam javítani, de belekerült 10 friss is a szórásba, az csak 0.3% hibaarány, bőven elviselhető kerekítési hiba :DDD

Hello IT! Have you tried turning it off and on again?

(#5926) tm5 válasza nyunyu (#5925) üzenetére


tm5
tag

UPDATE/DELETE végrehajtása előtt nem szoktál egy
--UPDATE/DELETE
SELECT * FROM
és a query többi része
lekérdezést futtatni? Nekem néhányszor mentett már életet.

(#5927) nyunyu válasza tm5 (#5926) üzenetére


nyunyu
félisten

Alaposan le volt tesztelve a query, csak arra nem számítottam, hogy a tesztek után 2 héttel élesítéskor lesznek olyan igénylések, amik a különböző rendszereink közötti útvesztőben ideiglenesen hibás állapotban lesznek.
Tesztek idején még nem is léteztek!!!

Hello IT! Have you tried turning it off and on again?

(#5928) cattus


cattus
őstag

Hali,

Az alábbi problémával szembesültem amit egyelőre nem sikerült megoldani. Postgres alatt adott két tábla, Users (id, customer_id) és Subscriptions (customer, status, created). Egy userhez nulla vagy több subscription is tartozhat (customer - customer_id kapcsolat). Az lenne a célom, hogy minden userhez lekérjem a legfrissebb subscription statuszát (created alapján, ha nincs, akkor null). Mi lenne erre a legegyszerűbb megoldás?

Do the thing!

(#5929) nyunyu válasza cattus (#5928) üzenetére


nyunyu
félisten

select u.*, s.status
from users u
left join (
select x.*,
row_number() over (partition by customer_id order by created desc) rn
from subscription x
) s
on s.customer_id = u.customer_id
and s.rn = 1;

Beszámozod a subscription táblát ügyfelenkénti létrehozási dátum szerint csökkenőbe, aztán ebből joinolod az első rekordot az usershez.

(Nem szeretek alquerykben group by-jal bohóckodni, mert úgy sokkal hosszabb+bonyolultabb+olvashatatlanabb lenne a kód.)

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5930) nyunyu válasza nyunyu (#5929) üzenetére


nyunyu
félisten

Mármint sokkal egyszerűbb, mint ügyfelenként meghatározni az utolsó előfizetési dátumot, és az ahhoz tartozó rekordot visszakeresni az előfizetés táblában, hogy utána joinolhassam az előfizetőhöz:

select u.*, s.status
from users u
left join (
select *
from subscription
where (customer_id, createdate) in (
select customer_id, max(createdate)
from subscription
group by customer_id) s
on s.customer_id = u.customer_id;

(Tényleg, Oraclen kívül van más olyan DB is, ami támogatja a sokoszlopos IN / NOT IN műveleteket?
Ha jól rémlik, ez a szintaxis nincs szabványosítva)

Valószínűleg ablakozós max() függvénnyel is lehetne írni, és akkor nem kellene a group by köré írt külső query:
select u.*, s.status
from users u
left join (
select *
from subscription
where createdate = max(createdate) over (partition by customer_id)
) s
on s.customer_id = u.customer_id;

Talán így a legrövidebb a kód.

[ Szerkesztve ]

Hello IT! Have you tried turning it off and on again?

(#5931) nyunyu válasza nyunyu (#5930) üzenetére


nyunyu
félisten

Szerkesztési idő lejárt. :(

Ha az ügyfélnek két azonos időbélyegű előfizetése van, akkor a row_number() -es megoldás véletlenszerűen vagy az egyiket vagy a másik státuszát fogja visszaadni, így csak 1 sor fog hozzá tartozni.
Míg a másik két opció mindkét legfrissebb előfizetés státuszát visszaadja, azokkal egy ügyfélhez 2 sort fogsz kapni.

(Ha a row_number()-t rank()-ra cseréled, akkor az is mindkettőt vissza fogja adni.)

Hello IT! Have you tried turning it off and on again?

(#5932) cattus válasza nyunyu (#5931) üzenetére


cattus
őstag

Köszi a részletes választ, egy időben egy userhez csak egy előfizetés tartozik, így az első is szuperül működik.

Do the thing!

(#5933) lanszelot


lanszelot
addikt

Hello,
Semmit se tudok az sql-ről.
Több kérdésem lenne:
Nekem php-hez kellene.
Gépemen van php, apache.
Sqlite-ot ajánlották, de semmit se találok hozzá. (Video tutorial)
Amit találok mindegyik terminalban turkálnak.
Azt írták nem kell terminálba turkálni, php alapból tudja, ha ini -ben beállítom.
Így azt se tudom hogy telepítsem.
Hogy induljak el.

Ezért mysql-t raktam fel. De ezzel se tudom mit kell csinálni, hogy php-val használjam. Ezzel se találtam semmi tutorial-t php hoz . Csak ilyen nagyon alap dolgok.

Amit szeretnék: páromnak weboldal ahova beírja a receptjeit.
Gombbal hozzá adja egyesével a hozzávalókat.
Tehát lenne a database receptek, tables pl kokusz kocka, és ebbe kellene bele a hozzávalók, és az elkészítés, hozzávalókba kell a tészta, krém, öntet, díszítés. És ezekbe a vaj, tojas, tej stb.
Ezt meg lehet így csinálni? Mert sehol se találtam több mélységer.
Igazából semmit se találok amire nekem szükségem lenne.

Nagyon alap tutorialokat végig néztem többet is. Hogy készítek, törlök, módosítok. Illetve ezt [link] végig olvastam. De ezekből nekem nem jött le, hogyan tudnám megoldani ami nekem kell.

(#5934) pch válasza lanszelot (#5933) üzenetére


pch
aktív tag

Írj rám, mert már megsajnáltalak :)

http://sb-soft.hu - "A" számlázó

(#5935) Jim Tonic válasza lanszelot (#5933) üzenetére


Jim Tonic
nagyúr

Generáltasd le Copilottal. :)

Alcohol & calculus don't mix. Never drink & derive.

Útvonal

Fórumok  »  Szoftverfejlesztés  »  SQL kérdések (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.