Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Numeracja kolejności w zapytaniu z zachowaniem GROUPowania

Witam,
tytuł średni ale nic mi nie przychodzi innego do głowy.

struktura + dane:

create table ttt(x int, gr int, val int);
insert into ttt values (1, 1, 543);
insert into ttt values (2, 1, 54323);
insert into ttt values (3, 1, 5716);
insert into ttt values (4, 1, 45);
insert into ttt values (5, 2, 14553);
insert into ttt values (6, 2, 143);
insert into ttt values (7, 2, 343);
insert into ttt values (8, 3, 643);
insert into ttt values (9, 3, 743);
insert into ttt values (10, 3, 943);


czyli wychodzi tak:


x gr val
-------------------
1 1 543
2 1 54323
3 1 5716
4 1 45
5 2 14553
6 2 143
7 2 343
8 3 643
9 3 743
10 3 943


zapytanie:


SELECT gr, val
FROM ttt
ORDER BY gr, val;


daje mi wyniki:

gr val
-----------
1 45
1 543
1 5716
1 54323
2 143
2 343
2 14553
3 643
3 743
3 943


problem: chciałbym dodać kolejną kolumnę z numeracją, zaczynając kolejne odliczanie od kolejnej grupy, czyli:


gr val seq
---------------------
1 45 1
1 543 2
1 5716 3
1 54323 4
2 143 1
2 343 2
2 14553 3
3 643 1
3 743 2
3 943 3


byłbym wdzięczny za jakieś sugestie.

Silnik to Oracle 11g.Irek Słonina edytował(a) ten post dnia 15.07.09 o godzinie 18:05
Łukasz Berezowski

Łukasz Berezowski
http://www.wookashbe
rezowski.com/

Temat: Numeracja kolejności w zapytaniu z zachowaniem GROUPowania

Tak na szybko.
Select *, ROWNUMBER FROM ttt WHERE GR = 1
UNION ALL
Select *, ROWNUMBER FROM ttt WHERE GR = 2
UNION ALL
Select *, ROWNUMBER FROM ttt WHERE GR = 3

Nie wiem czy funkcje zapisałem poprawnie nie używam ORACLE, ale sens jest zachowany...

Pozdrawiam,
J.

Tak się zastanawiam grupujesz po dwóch kolumnach, wystarczy zrobić distinct (UNIQUE jeśli dobrze kojarzę), aby osiągnąć ten sam efekt, jak w zapytaniu, chyba, że to tylko "rysunek" poglądowy i używasz, np. sumowania?

Select UNIQUE *, ROWNUMBER FROM ttt WHERE GR = 1
UNION ALL
Select UNIQUE *, ROWNUMBER FROM ttt WHERE GR = 2
UNION ALL
Select UNIQUE *, ROWNUMBER FROM ttt WHERE GR = 3Łukasz Berezowski edytował(a) ten post dnia 15.07.09 o godzinie 18:19
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Numeracja kolejności w zapytaniu z zachowaniem GROUPowania

Łukasz Berezowski:
Tak na szybko.
Select *, ROWNUMBER FROM ttt WHERE GR = 1
UNION ALL
Select *, ROWNUMBER FROM ttt WHERE GR = 2
UNION ALL
Select *, ROWNUMBER FROM ttt WHERE GR = 3

tak będzie po oraclowemu:

Select t.*, rownum FROM ttt t WHERE GR = 1
UNION ALL
Select t.*, rownum FROM ttt t WHERE GR = 2
UNION ALL
Select t.*, rownum FROM ttt t WHERE GR = 3;


i dziękuję, działa tak ja chciałem. Problem tylko
pojawia się, jeśli gr sięga paru tysiącom i nie znamy
ich liczby ;-)

W międzyczasie znalazłem rozwiązanie. Dla potomnych:

select gr, val, row_number() over (partition by gr order by val) seqnum
from ttt
order by gr, val;
Michał Goławski

Michał Goławski DW Specialist,
Hewlett-Packard

Temat: Numeracja kolejności w zapytaniu z zachowaniem GROUPowania

Piszę z pamięci więc musisz sprawdzić ...

SELECT
gr,
val,
Row_number() OVER (PARTITION BY gr ORDER BY val) seq
FROM ttt
ORDER BY gr, val;
Irek Słonina

Irek Słonina programowanie, bazy
danych i linuksy

Temat: Numeracja kolejności w zapytaniu z zachowaniem GROUPowania

Michał Goławski:
Piszę z pamięci więc musisz sprawdzić ...

SELECT
gr,
val,
Row_number() OVER (PARTITION BY gr ORDER BY val) seq
FROM ttt
ORDER BY gr, val;

Jak już wyżej napisałem. Działa. Dzięki ;-)



Wyślij zaproszenie do