Új hozzászólás Aktív témák
-
kw3v865
senior tag
Sziasztok!
Egy Triggeres kérdésem lenne hozzátok: MS SQL 2012-ben írok egy triggert, amely INSERT-t hatására fut le, és az új rekord egyik mezőjét frissíti. Hogyan kell hivatkozni az újonnan beszúrt rekordra?
Tehát csak és kizárólag az új sor egy celláját kell update-elnie.Most csak úgy működik, ha megadom az új rekord objectid-ját.
Jelenleg így néz ki:
CREATE TRIGGER nepesseg_szum ON OVEZETEK
AFTER INSERT
AS
BEGINDECLARE @TERULET GEOMETRY;
SET @TERULET=(SELECT SHAPE FROM OVEZETEK WHERE OBJECTID=26);
UPDATE OVEZETEK SET Nepesseg_ossz = (SELECT SUM (TELEPULES.LAKOSOK) FROM TELEPULES
WHERE TELEPULES.SHAPE.STWithin(@TERULET)=1) WHERE OVEZETEK.OBJECTID=26;
RETURN
END;Azt akarom, hogy ne kelljen megadni az objectid-t, hanem mindig a beszúrt sorra fut le. Hogyan lehetne ezt megoldani?
-
kw3v865
senior tag
Köszönöm, így már elég jól működik, de még nem tökéletes: már csak arra kell megoldást találni, hogy ha egynél több sort szúrok be az övezetek táblába, akkor is működjön.
Tehát ha pl. 2 új sor van, akkor ezt írja ki: Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Jól gondolom, hogy ehhez kurzort kellene használni?
-
kw3v865
senior tag
Egyelőre így néz ki jelenleg a triggerem a kurzorral, de a probléma továbbra is ugyanaz.
ALTER TRIGGER nepesseg_szum ON OVEZETEK
AFTER INSERT
AS
BEGINDECLARE @TERULET GEOMETRY
DECLARE @ID INTDECLARE @kurzor CURSOR
SET @kurzor = cursor FOR
SELECT SHAPE, OBJECTID FROM INSERTEDOPEN @kurzor
FETCH NEXT FROM @kurzor INTO @TERULET, @IDWHILE @@FETCH_STATUS = 0
BEGIN
UPDATE OVEZETEK SET Nepesseg_ossz = (SELECT SUM(n.lakosok) from NEPESSEG_EOV N
WHERE N.SHAPE.STWithin(@TERULET)=1) WHERE @ID=(SELECT OBJECTID FROM INSERTED);FETCH NEXT FROM @kurzor INTO @TERULET, @ID
ENDCLOSE @kurzor
DEALLOCATE @kurzor
END;Vajon hol ronthattam el?
-
kw3v865
senior tag
Így gondoltad?
CREATE TRIGGER nepesseg_szum ON OVEZETEK
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO OVEZETEK (OBJECTID, SHAPE, Nepesseg_ossz) SELECT I.OBJECTID, I.SHAPE, (SELECT SUM(n.lakosok) from NEPESSEG n
WHERE N.SHAPE.STWithin(I.SHAPE)=1) FROM INSERTED IEND;
Nem jó, mert "Unspecified error occured on SQL Server. Connection amy be terminated by server", miután megrajzolom az övezet poligont, majd mentem (commit-olom).
-
kw3v865
senior tag
Most próbáltam így is, de hiába, sajnos nem megy.
Igen, a Management Studioban futtatom. Az övezeteket pedig ArcGIS-ben rajzolom.Tehát a lényeg az hogy az alábbival viszont jól lefut, HA csak egy sort commit-olok egyszerre:
ALTER TRIGGER nepesseg_szum ON OVEZETEK
AFTER INSERT
AS
BEGIN
DECLARE @TERULET GEOMETRYSET @TERULET = (SELECT SHAPE FROM INSERTED)
UPDATE OVEZETEK SET Nepesseg_ossz = (SELECT SUM(n.lakosok) from NEPESSEG_EOV N
WHERE N.SHAPE.STWithin(@TERULET)=1) WHERE OVEZETEK.OBJECTID=(SELECT OBJECTID FROM INSERTED); -
kw3v865
senior tag
válasz kw3v865 #3403 üzenetére
Egyébként én valószínűnek tartom, hogy a PK (OBJECTID) okozhat gondokat, mert amíg csak UPDATE-elem, nincs gond, mindig növekszik szépen eggyel.
http://desktop.arcgis.com/en/arcmap/latest/manage-data/using-sql-with-gdbs/object-id.htmKicsit összekavarodnak a dolgok, amikor nem az ArcGIS adja az értéket az ObjectID-nak, viszont enélkül sem megy, mert ez a PK (és muszáj, hogy legyen egy PK).
-
kw3v865
senior tag
Sziasztok!
MS SQL Server 2012-t használok, Management Studioval. Szeretnlm megtekinteni a logját. Tehát minden insert, update stb. törtéést szeretnék látni. Hogyan lehetséges ez?
-
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?
-
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?
-
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.
-
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?
-
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/
-
kw3v865
senior tag
Sziasztok!
Tudtok-e nekem ajánlani olyan blogot, könyvet vagy bármilyen tananyagot", ahol kifejezetten a PostgreSQL függvények, lekérdezések teljesítményének optimalizálásával foglalkoznak? Olyan szoftvert fejlesztek, amiben nagyon fontos a futtatás sebessége. Itt nagy jelentősége van, hogy pl. 100 vagy 50 ms alatt fut le, és szeretnék ezen a téren fejlődni.
-
kw3v865
senior tag
válasz bambano #3748 üzenetére
@bambano
A célirányos indexek mit jelentenek tulajdonképpen? Hol tudok erről olvasni angolul? Most térbeli indexeket használok, ez sokat segít, ezek nélkül sokkal lassabb lenne.
@VirsLee
Autóban van a rendszer, valós időben kell működnie, max. 100 km/h-ig, de többnyire 80 alatt (teljesen offline, minden localhoston). Kapja a koordinátákat a nagy pontosságú GPS-től, és elsősorban térbeli lekérdezéseket kell futtatni. Jelenleg szimulálva megy a dolog, egy korábban rögzített track alapján, most éppen 25 ms-st állítottam be frissítési gyakoriságnak. ilyen gyakorisággal hívja meg a függvényeket. Többnyire PostGIS-es függvényeket használok, de ezeket kombinálom is általában, pl. a legközelebb lévő objektumok távolságát kell kiszámolni, vagy jeleznie kell, amikor az autó egy poligon területére megy rá, ilyenek. Alapvetően egyelőre meg vagyok elégedve a teljesítménnyel, de amikor bővülni fognak a funkciók (nem csak SQL, egyebek is), akkor azért már számíthat, hogy mennyi erőforrást igényel, sajnos a hardver teljesítménye korlátozott (bár aránylag jónak mondható). -
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben a max id-t (legutolsóként hozzáadott rekordot) hogyan lehet a leghatákonyabb módon lekérdezni? Update-elni akarok, és eddig így csináltam:
WHERE id=(select max(id) from table) vagy így:
WHERE id=currval('table_id_seq');Utóbbi az EXPLAIN ANALYSE szerint jóval gyorsabb execution time alpaján.
Létezik esetleg valami ezekenél még hatékonyabb, gyorsabb megoldás?
[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben van egy táblám, ami egyik mezőjében számokat tartalmaz ehhez hasonlóan:
4,5,6,10,11,12,55,56,57,888,889,890
Tehát számsorozatok, de van köztük kihagyás is. Azt szeretném csinálni, hogy ezeket csoportosítsa össze. Tehát egy új oszlopban kapjon egy azonosítót minden egyes csoport. Példámnál maradva 4 csoport lenne: az elsőben a 4,5,6. Másodikban a 10,11,12 stb.
Szerintetek hogyan lehetne ezt megvalósítani SQL-ben?
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-t használok és exportálok CSV-be adatokat for ciklussal így:
for rec in
select format('copy(select valami from table where nev=''%s'' order by gid)
to ''%s'' with csv delimiter '';'' HEADER',nev,'C:/eredmeny/'||nev||'.csv' ) scr from(
Select distinct nev from tabla)t
loop
execute rec.scr;
end loop;Ez most külön CSV-t hoz létre minden egyes névnek. Eddig rendben van, jól működik. Azonban, én azt szeretném, hogy a fájlnévben egy másik mező értéke is szerepeljen. Tehát ne csak a név, hanem egy másik oszlophoz tartozó érték is benne legyen a filenévben. Valahogy így: telepules_nev.CSV
Minden egyes településhez több név is tartozik.Szerintetek hogyan lehet ezt megvalósítani?
[ Szerkesztve ]
-
kw3v865
senior tag
válasz kw3v865 #3833 üzenetére
Na, elvileg megoldottam, így:
for rec in
select format('copy(select valami from table where nev=''%s'' order by gid)
to ''%s'' with csv delimiter '';'' HEADER',nev,telepules,'C:/eredmeny/'||telepules||'_'||nev||'.csv' ) scr from(
Select distinct nev, telepules from tabla)t
loop
execute rec.scr;
end loop;Azért még leellenőrzöm alaposan, hogy tényleg jó-e.
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben szeretnék kiválasztani SELECT-tel egy adott sort a sor száma alapján. Tehát van egy al-lekérdezésem, mely x db sort tartalmaz, és annak szeretném kiválasztani pl. a 3. sorát.
Van valami ötletetek miként lehet ezt megtenni? -
kw3v865
senior tag
Sziasztok!
A következő SQL-es (PostgreSQL) kérdésre keresem a megoldást:
adott egy táblám, melynek mezői: "id", "valami", "masvalami". Az "id" és a "valami" oszlopok fel vannak töltve, míg a "masvalami" egyelőre üres.
A feladat az, hogy a "masvalami" oszlopot UPDATE-eljem, melyhez egy függvényt alkalmazok (most teljesen irreleváns, hogy mit csinál ez a függvény).
A függvény 2 argumentumot kér: 1. a "masvalami" mező értéke 2. a következő sor "masvalami" mezőjének az értéke.
Szerintetek hogy lehetne ezt a legegyszerűbben és leggyorsabban megoldani? Számít a gyorsaság, hiszen 8 millió rekord van a táblában.[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben a következőre keresek hatékony, azaz gyors megoldást: adott egy táblám, melynek az ID mezője serial típusú, azaz minden egyes insertnél eggyel nő az értéke. Olyan lekérdezést írok, ami csak az utolsó, azaz legnagyobb ID-jú sort updateli. Szerintetek miként lehet kiválasztani a leggyorsabban a legutolsóként beinsertelt sort?
Most így csinálom:WHERE id IN (SELECT max(id) FROM table)
Van ennél hatékonyabb, azaz gyorsabb módszer?
[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben a következő kérdésre keresem a megoldást: adott két view 1-1 oszloppal és azonos számú sorral. A cél az lenne, hogy egy új view-ban szerepeljen ez a két oszlop. Hogyan lehet ezt megoldani? Simán így, hogy SELECT * FROM t1, t2 nem megy, mert nagyon sok sort ad vissza. Nyilván a cél az lenne, hogy ne legyen duplikátumot. Azaz, ami az egyes tábla első sorában szerepel, mellé a másik view első sorában szereplő adat kerüljön, magyarul egymás mellé kerüljön a két oszlop. Van erre valami ötletetek? Joint nem lehet csinálni, mert nincs közös mező.
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-t használok és egy olyan kérdésem lenne, hogy egy adott mezőből (varchar) kellene kiszedni egy stringet, amelynek a pontos hossza nem minden eesetben ugyanannyi, és a pozíciója sem fix, azaz nem mindig egy adott sorszámnál kezdődik és végződik. Csak azt tudom, hogy a számomra szükséges rész mindig így kezdődik:"ref"=>"" (az idézőjelekkel együtt)
A > utáni idézőjelek közötti rész az, ami változó és számomra releváns, de nem tudom, hogy hány karakter hosszú.Az addig okés, hogy kiválasztottam azokat, amelyek tartalmazzák a szükséges részt, így:
LIKE '%"ref"=>"%"
Viszont ebben az oszlopban még mindig sok felesleges infó található. A cél az lenne, hogy a felesleges karakterek kiszűrjem, azaz csak azt tartalmazza az eredmény, ami a kacsacsőr utáni két időzőjel között helyezkedik el. Van valami ötletetek miként lehetne ezt megoldani?[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ből szeretnék sémát exportálni pg_dump-pal. Annyi bonyolultság van, hogy a pg_dump.exe-t egy C#-ban megírt alkalmazás indítja el. A cél az lenne, hogy tudassam a felhasználóval, hogy sikeres volt-e a dump-olás. Van-e arra lehetőség, hogy kiírja a pd_dump az exit code-ot?
"-v"-vel kiír sok mindent, de vajon lehet-e olyat csinálni, hogy exit code 0 vagy 1-et kiírjon?
Vagy másképpen megközelítve a dolgot: ha "-v" nélkül futtatom és sikeresen lefut az exportálás, akkor nem ír ki semmit. Erre lehetne alapozni? Azaz, ha nem ír ki semmit, akkor tekinthető sikeresnek az exportálás?[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben írok egy függvényt, melynek az egyik insert-jével van probléma, de nem tudok rájönni, hogy mi ennek az oka. Azért kell az execute, mert a séma neve a függvény egyik bemenő paramétere ($1). Az id és a name pedig változók.
EXECUTE 'INSERT INTO '||$1||'.table (azonosito, nev) SELECT '||id||','||name;
Ezt a hibaüzenetet kapom: column "xyz" does not exist (itt az "xyz" a name változó értéke)
SQL state: 42703Ha függvényen kívül csak simán lefuttatom ezt:
INSERT INTO tesztsema.table (azonosito, nev) SELECT 2332,'xyz';
Akkor tökéletesen működik.
Vajon mi lehet a gond?
-
kw3v865
senior tag
válasz Lortech #4379 üzenetére
Köszi, igaz azóta már találtam egy megoldást, format-tal, nem túl szép megoldás, de működik:
EXECUTE format('INSERT INTO '||$1||'.table(azonosito, nev) VALUES($1,$2);') using id, name;
Egyébként a te megoldásodhoz miért kell aposztróf, ha egy változóról van szó? Tehát nem közvetlenül értékeket illesztek be, hanem változónak a nevét írom be.
Ami viszont ismét kifogott rajtam, az egy függvényargumentumban megadott nevű séma (plusz a benne lévő fix nevű tábla) létezésének ellenőrzése.
IF (EXECUTE 'SELECT to_regclass('''||$1||'.tablename'')')
ERROR: type "execute" does not exist
Tehát már az eleje is rossz.
Mit ronthattam el? -
kw3v865
senior tag
Üdv!
Van egy PostgreSQL-ben megírt függvényem (ennek tartalma most szerintem lényegtelen), melynek a teljesítményét kívánom tesztelni. Ez a függvény meg lesz majd hívva folyamatosan egymás után több ezerszer, értelemszerűen változó argumentumokkal. Ennek a teljesítményét szeretném most tesztelni. A lényeg: valahogy szimulálni akarom, hogy a valóságban nagyjából milyen gyorsan fut majd le a folyamat, ha több 1000-szer meghívom egymás után a függvényt.
Ehhez rendelkezésemre áll egy tábla, melyben a benne lévő adatokkal tudnám is tesztelni a függvényt. Tehát a terv az lenne, hogy írok egy függvényt, ami végigmegy egy FOR-ral az összes rekordon, kiszedi a felhasznákalandó értékeket változókba, és minden alkalommal meghívja a függvényemet úgy, hogy argumentumként ezeket a változókat adom meg.Szerintetek jó az elgondolás?
Íme kódom:
CREATE OR REPLACE FUNCTION sqlteszt()
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
i integer;
x double precision;
y double precision;
datetime timestamp without time zone;
BEGIN
FOR i IN SELECT id FROM proba
LOOP
SELECT p.x, p.y, p.datetime FROM proba p WHERE p.id=i
INTO x, y, weedpercent, datetime;
PERFORM masikfuggveny(x,y,datetime,true,false,false,true,false);
END LOOP;
END;
$BODY$;
Nem csinál semmit így, azaz lefut, de semmi hatása nincs (egyébként insert-eket is csinál, de az most lényegtelen). Ha a "masikfuggveny"-t csak simán meghívom tetszőleges bemeneti paraméterekkel, akkor tökéletesen működik.
Ha a PERFORM helyett SELECT-tel hívom meg a "masikfuggveny"-t, akkor ezt a hibaüzenetet kapom (pedig az is void, azaz nincs visszatérési értéke):
ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.Van valami ötletetek mi okozhatja a problémát?
-
kw3v865
senior tag
Sziasztok!
Fejlesztek egy alkalmazást (C#-ban, WinForm-os alkalmazás, Npgsql NuGet package használatával), amely a működése során a localhost-on lévő PostgreSQL adatbázisba ír adatokat (insert-el egy táblába). Jelenleg ez teljesen offline módon történik. Azonban felmerült egy olyan igény, hogy ez egy távoli PostgreSQL szervhez tudjon kapcsolódni, azaz ne kelljen állandóan menteni a táblákat, majd átvinni a másik gépre és ott betölteni, hanem közvetlenül a távoli adatbázishoz tudjon kapcsolódni.
Szerintetek ez mennyire biztonságos megoldás, ha "kiengedem" a netre a pg-t? Sajnos ilyen téren nincsenek tapasztalataim. Ebben az esetben mit javasolnátok? Esetleg VPN-nel biztonságos tudna lenni? -
kw3v865
senior tag
válasz bambano #4392 üzenetére
Köszönöm mindkettőtöknek a válaszokat! Több érdekes dolgot írtatok, az API-s megoldást elvetném, mert nem sok fogalmam van róla. Kicsit bővebben is kifejtem, mi lenne a cél: adott néhány kliens gép (jelenleg 3-4 db), ezek folyamatosan gyűjtik az adatokat és eltárolják egy táblában (localhoston). A cél az lenne, hogy szinkronizálni lehessen ezeket, azaz minden egyes gépen futó szoftver elérhesse (read only) a többi által rögzített táblák tartalmát. A szinkronizációnak nem szükséges valós időben megtörténnie, hiszen az is előfordulhat, hogy éppen nincs internet elérésük (földrajzilag mozgásban vannak a gépek). A gyakorlatban ez úgy nézne ki, hogy ha végeztek egy adott feladattal, akkor történne meg a szinkronizálás (néhány óránként).
Így, hogy alaposabban is tágondoltam, tulajdonképpen nem is szükséges ehhez, hogy PostgreSQL fusson a szerveren, ha az rsync-es megoldást használnám. Persze lenne egy szerver, melyre szinkronizálva lennének a táblák, és a kliensek innen szednék le a frissített txt-ket is, és ezután lennének frissítve a táblák a klieneseken. Vajon ez így működhet?
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-es kérdésem lenne, FOR ciklussal kapcsolatban:
Adott egy tábla, melyen végig akarok menni egy FOR-ral, de olyan sorrendben, hogy két mezőt vegyen figyelembe. Vannak csoport ID-k és azon belül az egyedi ID-k.
Az lenne a lényeg, hogy növekvő sorrendben menjen végig rajtuk, úgy, mint ORDER BY "ClassID", "ID".
Szerintetek ez így jó PostgreSQL-ben? Azaz helyesen írtam meg?DO $$
<<first_block>>
DECLARE
i int;
BEGIN
FOR i IN SELECT "ClassID", "ID FROM table ORDER BY "ClassID", "ID"
LOOP
END LOOP;
END first_block $$;
-
kw3v865
senior tag
válasz martonx #4458 üzenetére
Átgondoltam és kicsit máshogy közelítem meg a kérdést: adott egy tábla, melynek van egy ID mezője. Ehhez nem akarok hozzányúlni (később még szükség lehet rá). Azonban, szeretnék egy másik ID-t, ami természetesen szintén egyedi kell, hogy legyen. Erre azért van szükség, mert jelenleg nem a számomra megfelelő sorrendben vannak az adatok. Azaz, lényegében azt szeretném, hogy ORDER BY "ClassID", "Valami" ASC. Ez alapján legyen kiosztva az új ID, növekvő sorrendben.
Szerinted ezt hogyan lehetne megvalósítani a legegyszerűbben? Új táblát nem akarok, a már meglévővel kell dolgoznom.
Index-eléssel vajon megoldható? https://www.postgresql.org/docs/10/indexes-ordering.html
Ezáltal lenne egy indexem, de én egy új mezőt is akarok.
Ha megvan az index, majd csinálok egy CLUSTER-ezést: https://www.postgresql.org/docs/10/sql-cluster.html
Végül csak simán hozzáadok egy új serial mezőt, az jó megoldás lehet?[ Szerkesztve ]
-
kw3v865
senior tag
Üdv!
PostgreSQL 10-ben egy függvényt írok, melyben szeretnék létrehozni egy view-t. A problémám az, hogy nem tudok a view létrehozásakor változót használni.
Tehát példuál a WHERE feltételnél: a "x BETWEEN valtozo1 AND valtozo2" rész problémás. Azt írja hibaként, hogy column "valtozo1" does not exist. Ha a select ugyanez, de nem view-t hozok létre, hanem táblát, akkor tökéletesen működik.
Van erre valami megoldás? Vagy tényleg nem lehet PostgreSQL függvényben lévő VIEW létrehozásakor változóra hivatkozni? -
kw3v865
senior tag
Sziasztok!
PostgreSQL 11-et használok és törölni szeretnék minden cache-elt adatot. Miként lehet ezt megtenni? Függvényt írok, és most optimalizálni akarom a működését (emaitt sokszor le is futtatom azonos paraméterekkel, miután módosítottam a kódon), ezért azt szeretném, ha "tiszta lappal" indulna mindig. Van erre valami egyszerű, de biztos megoldás?
[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
PostgreSQL-ben timestamp indexelésre szerintetek melyik a legoptimálisabb index típus? BTREE helyett érdemes lehet BRIN-t használni? Vagy valami mást?
[ Szerkesztve ]
-
kw3v865
senior tag
Sziasztok!
Adott egy tábla:
CREATE TABLE test
(
value integer,
sector integer,
id integer NOT NULL DEFAULT nextval('test_id_seq'::regclass),
CONSTRAINT pk PRIMARY KEY (id)
);
A sector (értéke 1 - 5-ig terjedhet).
Egy olyan lekérdezést szeretnék írni, amely összegzi a value mező értékeit és csoportosítja szektor alapján az adatokat, de úgy, hogy a 2-es, 3-as és 4-es szektort összevonja, azaz egyben kezelje. Tehát ne 5, hanem 3 sort adjon vissza.
Nem egy bonyolult történet, de ezt egy lekérdezésben akarom megvalósítani, az eredeti tábla módosítása nélkül.SELECT SUM(value), sector FROM test GROUP BY sector;
Szerintetek hogyan lehet ezt a legegyszerűbb, leggyorsabb módon megvalósítani? Elég sok rekord lesz a táblában.
-
kw3v865
senior tag
Sziasztok!
Ismét PostgreSQL-es téma (de gondolom más SQL-ben is hasonló lehet a megoldás). Ezúttal adott egy GROUP BY probléma, amelynek során csoportokat akarok létrehozni, kissé bonyolult feltétellel.
Adott egy tábla, melynek egyik mezője értékeket tartalmaz, ezeket kell majd szummázni (illetve más, bonyolultabb műveleteket végezni, de most igyekszem leegyszerűsíteni).
Minden egyes rekordhoz tartozik egy start és egy end érték. Ezek különbsége nem haladhatja meg a 30-at, tehát olyan rekord nincs a táblában melynél a két érték különbsége nagyobb, mint 30.
Az összevonást úgy kell végrehajtani, hogy ez a szabály továbbra is érvényes legyen, ezáltal az eredmény táblában sem lehet olyan rekord, ahol a két érték különbsége nagyobb, mint 30.
Egy oszlopban a SUM, egy startmeter (értelemszerűen a legkisebb érték az adott csoportban, a) és egy endmeter (MAX).Így néz ki az input tábla, alatta pedig az eredmény, hogy kell kinéznie:
Úgy látom ez nem egy sima GROUP BY, mivel itt komolyabb csoportosításra van szükség.
Van valami tippetek miként lehetne ezt megvalósítani?
-
kw3v865
senior tag
Üdv!
PostgreSQL-ben timestamp alapján szeretnék GROUP BY-olni a következő módon: adott egy timestamp mező másodperces felbontásban és a cél az lenne, hogy azok a sorok kerüljenek összevonásra, amelyek közül a min és a max közti időkülönbség nem nagyobb 1 percnél.
Tehát pl. a '2021-06-08 10:11:34' és a '2021-06-08 10:12:10' össze kell, hogy vonódjon. Addig megoldottam, hogy perces bontásban legyenek csoportosítva, de ez így nem az igazi, mivel 2 másodperc különbség miatt (változik a perc, egyiknél 0 perc 59 másoderc, másiknál 1 perc 01 másodperc) is külön csoportba kerülnek.Jelenleg így néz ki:
SELECT
COUNT(*),
date_trunc('hour', datetime) + (
(
(
date_part('minute', datetime):: integer / 1 :: integer
) * 1 :: integer
) || ' minutes'
):: interval AS one_min_timestamp
FROM
table
GROUP BY
one_min_timestamp
ORDER BY
one_min_timestamp;
Van esetleg valami tippetek miként lehetne ezt továbbfejleszteni a fentebb felvázolt módon? -
kw3v865
senior tag
Köszi a választ, megnéztem ezzel a kóddal, de sajnos így az egymást követő sorokban a dátumok között csak 1-2 másodperc a különbség, és hiába állítom az interval értékét 1 percről akár 1000-re, ugyanazokat a dátumokat adja vissza. Kb. ugyanazt az eredményt adja, mint amikor egy egyszerű DISTINCT date-et futtatok a táblára. Legalább is a visszaadott sorok száma azonos.
Új hozzászólás Aktív témák
- Jövedelem
- Rossz üzlet az EV-kölcsönzés
- Milyen videókártyát?
- Milyen egeret válasszak?
- Motorola Moto G24 Power - hol van az erő?
- Elektromos rásegítésű kerékpárok
- Milyen TV-t vegyek?
- Garmin Forerunner 165 - alapozó edzés
- Na, még egyszer, csak ezúttal OnePlus Open néven
- Amazon Kindle
- További aktív témák...
- LG NanoCell 55NANO766QA Halvány píxel csík
- Philips 58PUS8545/12 1 ÉV GARANCIA Játék üzemmód
- Tyű-ha! HP EliteBook 850 G7 Fémházas Szuper Strapabíró Laptop 15,6" -65% i7-10610U 32/512 FHD HUN
- Bomba ár! HP EliteBook 840 G5 - i5-8G I 8GB I 128GB SSD I 14" FHD I HDMI I Cam I W10 I Gari!
- The Last of Us Part I Ps5