Mamy tabelkę, w której jest id, nazwa, wartość. Nazwa i wartość mogą się powtarzać, id jest unikalne. Chodzi jednak o to, żeby z z tabelki pobrać tylko te wiersze (id, nazwa, wartość), które dla danej nazwy mają największą wartość. Jeżeli dla danej nazwy mamy kilka wpisów z tą samą wartością to pokazać obojętnie który.
Po chwili namysłu naskrobałem coś takiego :
USE TEMPDB; DECLARE @T AS TABLE ( ID INT, NAZWA VARCHAR(10), WARTOSC INT ); INSERT INTO @T (ID, NAZWA, WARTOSC) VALUES (1, 'A', 10) , (2, 'B', 17) , (3, 'C', 23) , (4, 'A', 15) , (5, 'D', 33) , (6, 'B', 22) , (7, 'B', 22); WITH CTE AS ( SELECT ROW_NUMBER() OVER (PARTITION BY NAZWA ORDER BY WARTOSC DESC) AS I , ID , NAZWA , WARTOSC FROM @T ) SELECT ID , NAZWA , WARTOSC FROM CTE WHERE I = 1;
Użyłem funkcji ROW_NUMBER(), aby w obrębie nazwy nadać unikalne id (PARTITION BY NAZWA). Pierwsze id nadawane jest dla największej wartości (ORDER BY WARTOSC DESC).
Samo CTE wygląda tak :
Jakieś pomysły jak można to napisać prościej, inaczej ?
Brak komentarzy:
Prześlij komentarz