Új hozzászólás Aktív témák
-
bpx
őstag
válasz SunyaMacs #3650 üzenetére
select
t.topic_id,
t.topic_name,
coalesce(p.post_time, t.topic_time)
from
topics t
left join
(
select
topic_id,
max(post_time) as post_time
from
posts
group by
topic_id
) p
on (t.topic_id = p.topic_id)
;Ha meg azt akarnám, hogy gyors is legyen, akkor +1 oszlop a topics-ba, pl. last_post_time, amit post írásakor karban kell tartani, és akkor nem kell join meg aggregáció.
-
Petya25
addikt
Valami tipp arra, hogy MS SQL-ben, hogy tudnék egy Postgres adatbázisból átolvasni egy táblát?
Egy VIEW szerűség elég lenne olvasásra.Gép, DB és user nevem van hozzá.
Linked Server + ODBC-t próbáltam, nem nagyon akarja, vagy rosszul állítom be...
Antonio Coimbra de la Coronilla y Azevedo, bizony!
-
kw3v865
senior tag
Sziasztok!
A következő SQL-es kérdésem lenne. A feladat az, hogy adott egy úthálózat (ways tábla), illetve egy megye tábla (polygon), és az utakat fel kell darabolni a megyehatároknál.
Az alábbi lekérdezéssel ezt meg is tudtam oldani, viszont amire egyelőre nem találtam az, hogy az új táblában, ami már a szétdarabolt utakat tartalmazza, egy új oszlopban tartalmaznia kellene a régi ID-kat.
create table ways_split as (
WITH
lines_in_polygons AS(
SELECT ST_INTERSECTION(ways.geom,polygon.geom) as inter
FROM
ways, polygon
),
diff AS (
SELECT ST_Difference(ways.geom,ST_UNION(p.geom)) geom FROM
ways
JOIN polygon AS p ON
ST_INTERSECTS(ways.geom,p.geom)
GROUP BY ways.geom)SELECT ST_GeometryN(geom,n)
FROM diff AS d
CROSS JOIN
(SELECT
generate_series(1,ST_NumGeometries(geom)) as n FROM diff) n
UNION
SELECT inter
FROM lines_in_polygons);Tehát most arra kellene rájönnöm, miként tudom egy új oszlopban hozzáadni a vonalak eredeti ID-ját. Értelemszerűen a megyehatároknál elvágott új szakaszok ugyanazt az eredeti ID-t fogják kapni.
Van valami ötletetek miként lehetne ezt megvalósítani?
-
hemaka
nagyúr
Hello
Lenne egy gyors kerdesem. Van 3 db SQL fajlom, az egyik egy adatbazis, amit be is importaltam, azzal nincsen gond, csak hogy mellette meg van ketto masik amikkel nem tudom mit is kellene csinalni, dokumentaciom nincsen hozza.
create_indexes.sql
drop_indexes.sql
Ezeket futtatni kellene vagy micsoda? Koszi. -
Ispy
veterán
drop_indexes.sql
...gondolom törli az adatbázisról az indexeket
create_indexces.sql
...ez meg létrehozza újra
SQL server management studioban le kell futtatni a létrehozott adatbázison, gondolom.
"Debugging is like being the detective in a crime movie where you're also the murderer."
-
Iginotus
őstag
Van egy ilyen SQL em. (ORACLE)
update sds.forge
set code_neu=
(select orgeh_code from
(select * from sds.oe
order by dbms_random.value)
fetch first 1 row only)where row_id=1;
Van 9 sorom, hogyan tudom ezt ismételgetni 9 szer? Ciklusokat sosem írtam még
Row_id van 1-9 ig.
Lehet, hogy lesz több sok is egyes esetekben. Szóval n+1 kéne[ Szerkesztve ]
Plug and Pray... :)
-
nagyúr
válasz Iginotus #3658 üzenetére
hát ha csak ennyi sorod van abban a táblában, akkor az egész where felesleges.
de nem kell ciklust írnod, ha mondjuk olyat írsz, hogywhere row_id between 1 and 9
. ciklust meg majd írjon ilyenre az interpreter, ha akar.[ Szerkesztve ]
Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
Iginotus
őstag
válasz velizare #3659 üzenetére
Ez így nem járja, ez ugyanazt az adatod fogja minden sorba beírni
A lényeg, hogy az előző Randomos 9 szer lefusson 9 értéket kapjon amit beír 9 sorban lehetőleg randomban, ismétlés is lehet.
Ha csak ezt használom akkor egyszer fut csak le és egy értéke lesz mind a 9 sornak.Plug and Pray... :)
-
nyunyu
félisten
válasz Iginotus #3658 üzenetére
valami ilyesmi:
declare i number;
begin
for i in 1 .. 9 loop
update ...
where row_id=i
end loop;
end;Kevésbé procedurálisan gondolkozva persze meg lehet írni egy updatetel is, mivel van sorfolytonos IDd a táblán, amihez lehet row_number()-rel joinolni:
update sds.forge upd
set code_neu=
(select a.orgeh_code from
(select oe.*, row_number() rn from sds.oe
order by dbms_random.value) a
where a.rn=upd.row_id);[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
bpx
őstag
válasz Iginotus #3660 üzenetére
Az egy nem correlated subquery (magyarul még szebb: korrelált allekérdezés), ezért ami belül van, az egyszer lefut, és kívül mindenhova az ott kapott értéket használja. Lehet belőle correlated subquery-t csinálni valami értelmetlen feltétellel és akkor majd miden sorra újból kiértékelődik. Persze ez nem szép és kapásból odaírnám kommentbe, hogy ez miért van belegányolva. Vagy marad a ciklus, amit már első ránézésre is el lehet olvasni.
create table forge (row_id, code_neu) as select rownum, 0 from dual connect by level <= 10;
create table oe (orgeh_code) as select rownum from dual connect by level <= 4;
select * from forge;
ROW_ID CODE_NEU
---------- ----------
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
select * from oe;
ORGEH_CODE
----------
1
2
3
4
update forge set code_neu =
(
select orgeh_code from oe
----
where forge.row_id = forge.row_id
----
order by dbms_random.value fetch first 1 row only
)
where row_id between 1 and 9;
select * from forge;
ROW_ID CODE_NEU
---------- ----------
1 1
2 3
3 1
4 2
5 1
6 1
7 4
8 3
9 4
10 0 -
nagyúr
válasz Iginotus #3660 üzenetére
meh. egy frappáns tsql-es megoldás jutott eszembe erre, ott a newid-t checksumozva generáltunk egy random számot, amit a megfelelő méretűre faragtunk. de ez persze nem igazi random. oracle-ben a sys_guid() csinál hasonlót.
mondjuk én olyan állat vagyok, aki sqlben nem ír ciklust, mert tiltja a vallása.Tudod, mit jelent az, hogy nemezis? Az érintett, erősebb fél kinyilatkoztatása a méltó büntetés mértékét illetően. Az érintett fél jelen esetben egy szadista állat... én.
-
kw3v865
senior tag
Sziasztok!
A következő PostgreSQL-es lekérdezésemet szeretném optimalizálni, hogy gyorsabban lefusson.
SELECT DISTINCT s.region, s.protected, s.gid FROM (
SELECT CASE WHEN ST_Intersects(p.geom,pr.geom) then 'TRUE' ELSE 'FALSE' END AS protected, p.gid AS gid,r.name AS region
FROM point p
LEFT JOIN protected_area pr
ON ST_Intersects(p.geom,pr.geom)
LEFT JOIN region r
ON ST_Intersects(p.geom, r.geom)
) s;Azt csinálja, hogy kiírja, hogy az adott pont mely régióban (poligon) található, illetve azt, hogy védett területen van-e (protected_area). GIST index-szel el vannak látva a táblák, így most 7,5 M pontra kb. 6 perc alatt fut le, viszont a poligonokat tartalmazó táblák csak 3, illetve 1488 rekordot tartalmaznak.Szerintetek hogyan lehetne még gyorsítani a lekérdezést?
-
-
nyunyu
félisten
válasz Iginotus #3664 üzenetére
Ablakozó függvényt lefelejtettem:
update sds.forge upd
set code_neu=
(select a.orgeh_code from
(select oe.*, row_number() over (order by dbms_random.value) rn
from sds.oe) a
where a.rn=upd.row_id);vagy valami ilyesmi.
Hello IT! Have you tried turning it off and on again?
-
kw3v865
senior tag
válasz bambano #3666 üzenetére
Köszi a tippet, utánanézek. Eddig nem kellett foglalkoznom különösebben a performanciával, de most fontossá vált.
Még arra gondoltam, hogy az elején a CASE WHEN ST_Intersects(p.geom,pr.geom) then 'TRUE' ELSE 'FALSE' vajon elhagyható-e valahogy? Mert ugye most az ST_Intersects függvényt kétszer hívja meg, hiszen a JOIN is ezen alapul. Nekem az a cél, hogy ne csak a TRUE, hanem a FALSE rekordokat is lekérdezzem. Jobb módszert egyelőre nem találtam.
-
válasz kw3v865 #3665 üzenetére
annak a true-nak meg false-nek nem sok értelmét látom, mert ha védett régióban van, akkor a védett régió neve oszlop nem null lesz, ha meg nem ott van, akkor igen.
viszont ez nem kellene, hogy sokat lassítson, mert a postgresql elméletileg becacheli az adatokat meg az eredményeket.
ha a kifejezés elé írsz egy explain-t, akkor megmondja az optimalizáló, hogy mit fog csinálni. azt érdemes bogarászgatni.
szerk: azt az egész case-t ki lehetne váltani szerintem úgy, hogy a lekérdezett mezők közé felveszed a védett régió nevét, és egy coalesce-vel beleírsz valamit, ha üres: coalesce(pr.name,'FALSE') as name.
[ Szerkesztve ]
Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
Fundiego
tag
Van olyan sql parancs ami a következőt teszi?
Megadok egy feltétel Select gyumolcs from gyumi WHERE honap='januar'" ezzel egymás alá egy oszlopban dobja ki az értékeket. Nekem olyan kéne ami egy rekordba vesszővel elválasztva adná meg az értéket.
Az első esetben ez a végeredmény:
Narancs
BanánAmi kellene nekem az a következő végeredmény.
Narancs,Banán -
-
szoke12
őstag
Sziasztok!
Adott egy program, amit én írtam. Van benne adatbázis-kezelés is, az adatbázis elérését viszont nem minden LocalDB találja meg. Ez azt jelenti, hogy a programom csak az adott LocalDB-vel fog működni? Az újabbakkal nem is működhet?
"Élj úgy, hogy ha majd lepereg előtted életed filmje, érdemes legyen végignézni!"
-
kem
addikt
Sziasztok!
Ismet egy kis segitsegre lenne szuksegem TimesTen adatbazissal kapcsolatban, Van nekem egy nyakatekert SQL querym aminek az eredmenyet szeretnem insertalni egy tablaba, a kovetkezo keppen:
INSERT INTO subscription_attribute VALUES(<ide szeretnem belistazni a kovetkezo kimenetet>, 167463909189556, 1, '<null/>');
select s."UID"
from subscription s
join SUBSCRIPTION_RESOLVE_KEY srk on s."UID" = srk.SUBSCRIPTION_UID
join account a on s.OWNING_ACCOUNT_UID = a."UID"
left outer join boostGainEnabled ml on s."UID" = ml.SUBSCRIPTION_UID
where
ml.SUBSCRIPTION_UID is null
and srk.DOMAIN_RESOLVE_KEY_UID = (
select drk."UID" from DOMAIN_RESOLVE_KEY drk
where drk.ID like 'guestPIN')
and a.id like '%xy007%'
and s.id like '%xy%'
order by s."UID";A boostGainEnabled egy view-t takar, amit igy hoztam letre:
create view boostGainEnabled as
select s."UID" as SUBSCRIPTION_UID
from subscription s
join subscription_attribute sa on s."UID" = sa.SUBSCRIPTION_UID
join account a on s.OWNING_ACCOUNT_UID = a."UID"
join domain_parameter dp on sa.DOMAIN_PARAMETER_UID = dp."UID"
where dp.ID like 'boostGainEnabled';Szoval a kerdesem az lenne, hogy hogyan agyazok be az INSERT-em egyik Value helyere egy subqueryt?
Elore is koszonom szepen a segitseget!
Köszi!
-
kem
addikt
Sikerult felig.
INSERT INTO subscription_attribute
select
s."UID", 167463909189556, 1, '<null/>'
from subscription s
join SUBSCRIPTION_RESOLVE_KEY srk on s."UID" = srk.SUBSCRIPTION_UID
join account a on s.OWNING_ACCOUNT_UID = a."UID"
left outer join boostGainEnabled ml on s."UID" = ml.SUBSCRIPTION_UID
where
ml.SUBSCRIPTION_UID is null
and srk.DOMAIN_RESOLVE_KEY_UID = (
select drk."UID" from DOMAIN_RESOLVE_KEY drk
where drk.ID like 'guestPIN')
and a.id like '%xy007%'
and s.id like '%xy%'
order by s."UID";Most mar csak azt szeretnem, ha a 167463909189556 helyett tudnam hasznalni a parameter nevet. Erre egy masikat irtam, a kettot kene valahogy osszegyurni.
INSERT INTO subscription_attribute
select
168504837876601, dp."UID", 1, '<null/>'
from DOMAIN_PARAMETER dp where ID like 'boostGainEnabled';Szerk, meg is van:
INSERT INTO subscription_attribute
select
s."UID", dpa."UID", 1, '<null/>'
from DOMAIN_PARAMETER dpa, subscription s
join SUBSCRIPTION_RESOLVE_KEY srk on s."UID" = srk.SUBSCRIPTION_UID
join account a on s.OWNING_ACCOUNT_UID = a."UID"
left outer join boostGainEnabled ml on s."UID" = ml.SUBSCRIPTION_UID
where
ml.SUBSCRIPTION_UID is null
and srk.DOMAIN_RESOLVE_KEY_UID = (
select drk."UID" from DOMAIN_RESOLVE_KEY drk
where drk.ID like 'guestPIN')
and a.id like '%xy007%'
and s.id like '%xy%'
and dpa.ID like 'boostGainEnabled'
order by s."UID";Bocs, hogy ideszemeteltem, de reggel meg biztos voltam benne, hogy nem fog sikerulni
[ Szerkesztve ]
Köszi!
-
Petya25
addikt
Hali
Valami egyszerű tipp arra, hogy sok manuál melót elkerüljek a kódolásnál, ami annyit tenne, hogy egy sokmezős lekérdezés a rekord mezőit ne egymás mellé sorlja fel, hanem egymás alatt soronként mellette az értékkel?
select mező1, mező2, ... mező10 from tábla
mező1, érték1
mező2, érték2
...
mező10, érték10Valami olyan kéne mint excelben a transzponálás sorból oszlop kb...
Antonio Coimbra de la Coronilla y Azevedo, bizony!
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben a következő problémára keresek megoldást, egyelőre nem nagy sikerrel:
adott egy tábla, amely a distance mezőben lebegőpontos értékeket tartalmaz (több millió rekord) 0 és 1000 között. Ebből olyan hisztogramot készítettem (külön táblába), amely 0.2 "széles" csoportokra bontotta fel. Tehát 5000 rekordot tartalmaz így a hisztogram tábla. A probléma csak az, hogy ha egy intervallumba pl. 80.2 és 80.4 közé nem esik egyetlen érték sem, akkor a hisztogram tábla a darabszámhoz nem 0-t, hanem 1-et ír.Ezt használom a hisztogram elkészítéséhez: https://github.com/borrob/histogram/blob/master/histogram_functions.sql
Van esetleg valami ötletetek, miként lehetne ezt a hibát kiküszöbölni?
-
K1nG HuNp
őstag
Hol találok egy MS Accesson alapuló SQL gyorstalpalót olvasni? Az érettségihez kellene. Rájöttem, hogy milliószor egyszerübb kódban irni mint kattingtani accessben, és még átláthatóbb is.
(raw_item.get("pk").unwrap().as_s().unwrap().to_string()).split("#").collect::<Vec<&str>>()[1].to_string()
-
válasz Apollo17hu #3686 üzenetére
nem
szerintem az lenne a legegyszerűbb megoldás, hogyha a lebegőpontos értéket megszorozza 5-tel és veszi az egészrészét, akkor megkapja, hogy hanyadik hisztogram oszlopba kerül az az eredmény, vagyis count és group by már használható.Egy átlagos héten négy hétfő és egy péntek van (C) Diabolis
-
kw3v865
senior tag
válasz bambano #3687 üzenetére
Végül is a megoldás az lett, hogy egy másik hisztogram-készítő függvényt találtam, ami már tökéletesen megfelel az elvárásaimnak: http://blog.faraday.io/how-to-do-histograms-in-postgresql/
-
mr.nagy
tag
Sziasztok!
Adott egy tábla, ebben 1 oszlopban a szétosztható mennyiség és 20 oszlopban az igények. Na most amikor az összes igény kevesebb mint a szétosztható akkor nincs gond, de ha kevesebb akkor arányosan csökkenteni kellene az igényeket a szétosztható mértékig. Csak egész szám lehet az eredmény (nem lehet 0.8 tortát odaadni).
Szerintetek megoldható ez SQL-ben és hogyan? Ha számít MS SQL a környezet..
HMNote10Pro
-
mr.nagy
tag
Szia,
Erre gondoltál?
http://sqlfiddle.com/#!18/e6f55/2
Egy ilyen táblából kellene akár külön táblába, akár ezt felülírva,megcsinálni amit írtam.
HMNote10Pro
-
Ispy
veterán
válasz mr.nagy #3694 üzenetére
Hát ez elég bonyi, szóval megoldani nem fogom helyetted.
De első körben szétszedném a táblát más formátumba, visszapivotosítanám:
Kioszthato, Oszlop, Ertek, ElteresTotal, IdealisErtek
Aztán ki kell találni valami algoritmust, függvény, amivel megkapod a jó számokat, egyelőre eddig jutottam.
Persze lehetne írni egy giga-mega ciklust, ami végigrohan a rekordokon és mezőkön, de én ciklust csak akkor használok, ha behatárolható mennyiségű rekordot tartalmaz a source, mert különben képes az idő végéig futni.
"Debugging is like being the detective in a crime movie where you're also the murderer."
-
varsam
őstag
válasz mr.nagy #3696 üzenetére
szia
excelben összeraktam valami hasonlót, ha jól értettem mi a feladat
A pivotban látod, hogy az 1,2,3-as vevőknek mekkora igényei voltak, mennyit kapnak és mennyi a maradék, ami az átlagolás miatt nem kerül szétosztásra.
SQL-ben analitikus függvényekkel meg lehetne csinálni ugyanígy szerintem.
[ Szerkesztve ]
-
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 -
mr.nagy
tag
Új hozzászólás Aktív témák
- Samsung Galaxy S23 Ultra - non plus ultra
- NVIDIA GeForce RTX 4080 /4080S / 4090 (AD103 / 102)
- Kerékpárosok, bringások ide!
- Gumi és felni topik
- Poco X6 Pro - ötös alá
- OLED TV topic
- Intel Dual Core 2000 felhasználók barátságos offolós topikja
- Milyen okostelefont vegyek?
- Bestbuy játékok
- Autós topik
- További aktív témák...
- Palit Gtx 1070Ti dual
- Alone in the dark 4-The new nightmare PC lemezes játék készletről
- Iphone 11 Pro Max 64, Gold, fél éves akkumulátor, ajándék tokok
- UMAX negatív szkenner-dia szkenner / AGFA Arcus 1200-as megfelelője
- Szinte új hibátlan garis GIGABYTE X670 GAMING X AX( 16 +2+2VRM!) ár alatt. Igény szerint rammal.