Zbigniew R.

Zbigniew R. Kierownik Działu IT,
SKOK Kujawiak

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Witam, pokrótce co potrzebuję:

Mam dwie tabele:

tabela_1
(numer sprawy i ID osoby, której dotyczy, ilość spraw i osób dowolnie duża)

id_sprawy, id_osoby
1, 19909
2, 333
3, 2312321
4, 18232
...

tabela_2
(numer sprawy + ID pracowników zajmujących się sprawą, ilość pracowników przypisanych sprawie - max 4)

id_sprawy, id_prac
1, A
1, B
2, C
3, D
4, B
1, E
2, A
...

potrzebuję uzyskać wynik w postaci:
id_sprawy, id_prac_1, id_prac_2, id_prac_3, id_prac_4
1, A, B, E, null
2, C, A, null, null
...

lub taka postać:

id_sprawy, lp, id_prac
1, 1, A
1, 2, B
1, 3, E
2, 1, C
2, 2, A
...

Ma ktoś pomysł jak najszybciej tego dokonać? Ewentualnie jakiś przykład, tutorial?
Baza to Postgres 8.2.4Zbigniew Rutkowski edytował(a) ten post dnia 01.12.09 o godzinie 11:09
Paweł K.

Paweł K. Administrator
Systemów
Informatycznych

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Zbyszek,

A co jest u Ciebie kluczem podstawowym obu tabel?
Bo gdyby był to np. nr sprawy, to myśle, że byłoby w miarę proste.

Pzdr, Paweł
Zbigniew R.

Zbigniew R. Kierownik Działu IT,
SKOK Kujawiak

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Dla obu tabel kluczem jest id_sprawy.Zbigniew Rutkowski edytował(a) ten post dnia 01.12.09 o godzinie 11:45
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Odnośnie rozwiązania drugiego:

http://www.depesz.com/index.php/2007/08/17/rownum-anyo...

ewentualnie upgrade do 8.4 i użyć konstrukcji Oracle'owej:

select t1.id_sprawy, t2.id_prac, row_number() (partition by t1.id_sprawy order by t2.id_prac) from tabela_1 t1 join tabela_2 t2 on (t1.id_sprawy=t2.id_sprawy)

Tekst Depesza do partition by:
http://www.depesz.com/index.php/2009/01/21/waiting-for...Irek Słonina edytował(a) ten post dnia 01.12.09 o godzinie 12:30
Zbigniew R.

Zbigniew R. Kierownik Działu IT,
SKOK Kujawiak

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Dzięki za pomoc.

Niestety opcja z okienkowaniem nie wchodzi w grę bo nie mam możliwości upgrade'u do 8.4
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Zbigniew Rutkowski:
Dzięki za pomoc.

Niestety opcja z okienkowaniem nie wchodzi w grę bo nie mam możliwości upgrade'u do 8.4

Tak więc zostaje rozwiązanie z pierwszego URL-a.

oryginał z przykładu:

select rownum(length(x.some_word)::text), * from (select some_word from test order by length(some_word) desc ) x;


tak więc pożądane zapytanie będzie wyglądać mniej-więcej tak:

select
id_sprawy,
rownum(id_sprawy::text),
id_prac
from (
select
t1.id_sprawy,
t2.id_prac
from tabela_1 t1
join tabela_2 t2 on (t1.id_sprawy=t2.id_sprawy)
)


oczywiście pierw musisz utworzyć rownum(in_code TEXT) na swojej bazieIrek Słonina edytował(a) ten post dnia 01.12.09 o godzinie 13:12
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Zbigniew Rutkowski:
Dzięki za pomoc.

Niestety opcja z okienkowaniem nie wchodzi w grę bo nie mam możliwości upgrade'u do 8.4

Widzę, że postgresql jest trochę podobny do pl/sql-a i można tam wykorzystać kursory (nie miałam z postgres'em do czynienia, więc sory, jeśli się mylę).

Bez zapytań z okienkowaniem chyba najłatwiej będzie się posłużyć procedurą z pętlą, która robi przejazd przez kursor z posortowanymi polami ID_SPRAWY, ID_PRAC (to drugie, żeby było ładnie :) ).

I chyba nie musisz używać do tego tej tabeli:
"tabela_1: (numer sprawy i ID osoby, której dotyczy, ilość spraw i osób dowolnie duża)"
Wystarczy Tabela 2.

pozdr
Iza

konto usunięte

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Coś co zwykle działa przy każdym problemie LP (chociaż może nieoptymalne):


select i1.id_sprawy, i1.id_prac,
1 + (select count(*) from tabela_2 i2
where i2.id_sprawy = i1.id_sprawy and i2.id_prac > i1.id_prac)
from tabela_2 i1


(SQL napisany na sucho - może mieć błędy)
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Oracle pl/sql:
Może się przyda. Działa dla wariantu:
"id_sprawy, id_prac_1, id_prac_2, id_prac_3, id_prac_4
1, A, B, E, null
2, C, A, null, null"
ale z przecinkiem na końcu linii (po ew. ostatnim nullu).


DECLARE
v_id_sprawy tabela1.id_sprawy%TYPE;
v_id_prac tabela1.id_prac%TYPE;
v_id_sprawy_obecnej tabela1.id_sprawy%TYPE;
v_wiersz VARCHAR2( 200 BYTE );
v_liczba_przecinkow NUMBER( 10 );

CURSOR c1
IS
SELECT ph.id_sprawy
, ph.id_prac
FROM tabela1 ph
ORDER BY 1
, 2;
BEGIN
OPEN c1;
v_id_sprawy_obecnej := NULL;
v_wiersz := '';

LOOP
v_liczba_przecinkow := 0;
FETCH c1
INTO v_id_sprawy
, v_id_prac;
EXIT WHEN c1%NOTFOUND;
IF v_id_sprawy_obecnej IS NOT NULL
THEN
IF v_id_sprawy_obecnej = v_id_sprawy
THEN
v_wiersz := v_wiersz || v_id_prac || ',';
ELSE
v_liczba_przecinkow :=
5
- LENGTH
( REPLACE
( TRANSLATE( v_wiersz, '1234567890', ' ' ), ' ' )
--liczba przecinkow przy zalozeniu, ze jeden jest na koncu linii
);
DBMS_OUTPUT.put_line( v_wiersz
|| REPLACE( RPAD( ' '
, v_liczba_przecinkow + 1
, ','
)
, ' '
)
);
v_id_sprawy_obecnej := v_id_sprawy;
v_wiersz := v_id_sprawy || ',' || v_id_prac || ',';
END IF;
ELSE
v_id_sprawy_obecnej := v_id_sprawy;
v_wiersz := v_id_sprawy || ',' || v_id_prac || ',';
END IF;
END LOOP;
CLOSE c1;
END;


edytowałam, żeby wyrzucić niepotrzebną zmienną "i"Izabela Korzińska edytował(a) ten post dnia 01.12.09 o godzinie 17:56
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Izabela Korzińska:
Oracle pl/sql:
Może się przyda. Działa dla wariantu:
"id_sprawy, id_prac_1, id_prac_2, id_prac_3, id_prac_4
1, A, B, E, null
2, C, A, null, null"
ale z przecinkiem na końcu linii (po ew. ostatnim nullu).
(...)

:)
i przy założeniu, że ID_PRAC to typ numeryczny, a nie znakowy (sądzę, że literek użyłeś, żeby łatwiej nam było zrozumieć, o co Ci chodzi).

konto usunięte

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

rank () over chyba będzie szybciej oczywiście mowa o ORACLE
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Jakub Suchocki:
rank () over chyba będzie szybciej oczywiście mowa o ORACLE

wcześniejszy post Zbyszka:
"Niestety opcja z okienkowaniem nie wchodzi w grę bo nie mam możliwości upgrade'u do 8.4"
Łukasz Dudek

Łukasz Dudek Database
Administrator

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

wydaje mi się że ten maly przykład będzie baaardzo pomocny

http://www.depesz.com/index.php/2009/06/23/tips-n%e2%8...
Izabela Korzińska

Izabela Korzińska Architekt /
Developer ETL/TEam
Leader, Roche Polska

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Łukasz Dudek:
wydaje mi się że ten maly przykład będzie baaardzo pomocny

http://www.depesz.com/index.php/2009/06/23/tips-n%e2%8...

piękne :)))
Szkoda, że nie można takiego plain-sql'a puścić pod oraclem. Pooowiedz mi, że się mylę :) Zawsze, kiedy chciałam popisać tylko w sql-u, musiałam używać funkcji analitycznych i do tego sys_connect_by_path.
Zbigniew R.

Zbigniew R. Kierownik Działu IT,
SKOK Kujawiak

Temat: [PG] Wygenerowanie lp w ramach podgrupy rekordów

Dziękuję wszystkim za pomoc, skorzystałem z rozwiązania opisywanego przez Depesza.

Pozdrawiam

Następna dyskusja:

[postgres] usuwanie zduplik...




Wyślij zaproszenie do