Grupowanie, a następnie wybranie konkretnego rekordu z każdej z grup

0

Mam taką tablicę:

id	name	status
------------------------
3	test_1	passed     <---
2	test_1	skipped
1	test_1	failed
3	test_2	skipped
2	test_2	skipped
1	test_2	failed     <---
2	test_3	skipped    <---
1	test_3	skipped

Chciałbym posegregować kolumnę name na podstawie id od największego do najmniejszego, a następnie zwrócić te rekordy, w których pierwszą wartością kolumny status jest nie skip. Czyli dla test_1 byłby to rekord o id=3, dla test_2 rekord o id=1, a dla test_3 rekord o id=2 ponieważ wszystkie wartości są skipped
Mam z tym problem, ponieważ, po group by mogę się odnieść do danych tylko poprzez funkcje agregacyjne, a ja potrzebuję znaleźć określony rekord na podstawie wartości kolumny status dla każdej z grupy.
Na koniec muszę podliczyć ilość wystąpień passed, failed, skipped

2

funkcja okna na ratunek:
PostgreSQL FIRST_VALUE Function

1

W postgresie -> http://sqlfiddle.com/#!17/b830e/1

  1. Używamy funkcji analitycznych (wspomniane FIRST_VALUE + ROW_NUMBER)
  • FIRST_VALUE zwraca pierwszą wartość w ramach uporządkowanej grupy
  • ROW_NUMBER numeruje wartości w ramach uporządkowanej grupy
  1. Grupę tworzymy po nazwie testu

  2. Porządkujemy rekordy w ramach grupy

  • Po ID
  • ...ale preferujesz statusy != skipped

Grupę porządkujemy względem 2 atrybutów (status skipped mapujemy na 0, a pozostałe na 1) - w efekcie jesteśmy w stanie najpierw uwzględnić tę preferencję - ORDER BY CASE ... END, a w drugiej kolejności ID testu.

  1. Numerujemy wartośći w ramach grupy (pojawia się nowy atrybut rn - row number) i wybieramy wartości id/status dla pierwszego rekordu z grupy.

  2. Wybieramy tylko rekordy z numerem 1 (rn=1).

1 użytkowników online, w tym zalogowanych: 0, gości: 1