Piotr Warda

Piotr Warda
Informatyk-ekonomist
a

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

Witam,

Siedzę już od dłuższego czasu i próbuję zrobić następujące zestawienie:

Mam w tabeli (MS SQL) sporo rekordów, chciałbym je pogrupować wg jednego pola i wyświetlić w całości(!) pierwsze wiersze z każdej z grup.

Wiem, że można to zrobić w pętli filtrując najpierw np. do tabeli tymczasowej nazwę kolumny grupującej.

A może ktoś zna jakieś sensowne rozwiązanie, by jednym zapytaniem to załatwić?

Pozdrawiam,Ten post został edytowany przez Autora dnia 07.01.15 o godzinie 11:05

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

Może np. tak?

Przykładowa tabela:
CREATE TABLE test(ID INT IDENTITY(1,1), Kol1 NVARCHAR(10), Kol2 NVARCHAR(10), Kol3 FLOAT)

INSERT INTO test VALUES('Kowalski', 'Grupa 1', 1)
INSERT INTO test VALUES('Kowalski', 'Grupa 1', 2)
INSERT INTO test VALUES('Kowalski', 'Grupa 1', 3)

INSERT INTO test VALUES('Kowalski', 'Grupa 2', 10)
INSERT INTO test VALUES('Kowalski', 'Grupa 2', 20)
INSERT INTO test VALUES('Kowalski', 'Grupa 2', 30)

INSERT INTO test VALUES('Nowak', 'Grupa 1', 100)
INSERT INTO test VALUES('Nowak', 'Grupa 1', 200)
INSERT INTO test VALUES('Nowak', 'Grupa 1', 300)

INSERT INTO test VALUES('Nowak', 'Grupa 2', 1000)
INSERT INTO test VALUES('Nowak', 'Grupa 2', 2000)
INSERT INTO test VALUES('Nowak', 'Grupa 2', 3000)


Zapytanie (grupowanie po Kol1 i Kol2, trzeba też po czymś posortować):

SELECT tmp.*
FROM
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY t.Kol1, t.Kol2
ORDER BY t.ID DESC) AS rnum
FROM test t

) tmp
WHERE tmp.rnum = 1


Wynik:
ID   Kol1	Kol2	   Kol3   rnum
3 Kowalski Grupa 1 3 1
6 Kowalski Grupa 2 30 1
9 Nowak Grupa 1 300 1
12 Nowak Grupa 2 3000 1
Ten post został edytowany przez Autora dnia 07.01.15 o godzinie 11:45

Wojciech Gardziński

Wypowiedzi autora zostały ukryte. Pokaż autora
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

SELECT * FROM tabela WHERE id IN (SELECT Max(id) FROM tabela GROUP BY pole)

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

Marcin M.:
SELECT * FROM tabela WHERE id IN (SELECT Max(id) FROM tabela GROUP BY pole)

Szacun za genialną prostotę rozwiązania, które ja, dla odmiany, skomplikowałem ;]Ten post został edytowany przez Autora dnia 07.01.15 o godzinie 14:10
Piotr Warda

Piotr Warda
Informatyk-ekonomist
a

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

Witam,
Marcin M.:
SELECT * FROM tabela WHERE id IN (SELECT Max(id) FROM tabela GROUP BY pole)

I to na prawdę proste rozwiązanie w całości rozwiązuje sprawę. Z jednym tylko małym 'ale':

Ponieważ grupowanie mam po jednym polu - dla wyfiltrowania pierwszych rekordów zamiast Max(id) należy użyć Min(id).

Pozdrawiam,
Marcin Miga

Marcin Miga Programista. Po
prostu programista.

Temat: Wyświetlanie pierwszych rekordów z poszczególnych grup

Ech, bo dla mnie pierwsze, to najnowsze. Czyli największe ID. Max(id).
Ale nie wszyscy myslą tak jak ja :)



Wyślij zaproszenie do