MSSQL wyznaczenie rankingu tylko dla konkretnej wartości w tabeli

MSSQL wyznaczenie rankingu tylko dla konkretnej wartości w tabeli
RL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Dysponuje zapytaniem, które pokazuje mi wyniki z zawodów posortowane względem czasu który uzyskali na punktach pomiarowych.
Czy istnieje sposób w SQL wyznaczenie klasyfikacji końcowej ale tylko dla tych wartości gdzie np. Lap = 2. oraz wyznaczenie klasyfikacji końcowej ze względu na płeć zawodnika. Poniżej przedstawiam wynik zapytania które posiadam.
W skrócie:

  • LP. to liczba porzadkowa wszystkich "odczytów" zawodnika na punkcie pomiarowym
  • MSC OPEN to miejsce open w całych zawodach. To miejsce open powino się uzupełniać tylko w momencie gdy kolumna "Lap" ma wartość np. 1 (jest to czas brutto w tym przypadku, lap 2 to czas netto)
  • MSC M - wyznacza klasyfikację uwzględniając pleć zawodnika oraz wartość w Lap np. 1
  • MSC K - jak wyżej tylko, że u kobiet

Te wszystkie wyniki, które mi się wyświetlają chciałbym je widzeć ale ranking się uzupełnia tylko w momencie gdy spełnione są warunki.
Czy w ogóle da się takie coś zrobić??

Kopiuj
Select 
	ROW_NUMBER() OVER(ORDER BY Czas) AS 'Lp.',
	ROW_NUMBER() OVER(ORDER BY Czas)  AS 'MSC OPEN' ,
    NrStartowy.Nr_startowy,
	Zawodnicy.imie, 
	Zawodnicy.nazwisko, 
	Zawodnicy.plec,
	ROW_NUMBER() OVER(PARTITION BY Zawodnicy.plec ORDER BY Czas)  AS 'MSC M' ,
	ROW_NUMBER() OVER(PARTITION BY Zawodnicy.plec ORDER BY Czas)  AS 'MSC K' ,
	CONVERT(varchar(50),Wyniki.Czas,14) as Czas, 
	Wyniki.Lap
FROM [Gepard_2].[dbo].[Runners] as Zawodnicy 
RIGHT JOIN 
[Gepard_2].[dbo].[ReadingTimes_Converted_Brutto] as Wyniki 
	ON Zawodnicy.Tag_id = Wyniki.Tag_Id and Zawodnicy.zawody_id = '326'

inner JOIN
[Gepard_2].[dbo].[Tags] as NrStartowy
	ON Zawodnicy.Tag_id = NrStartowy.[id] 
inner JOIN
[Gepard_2].[dbo].Zawody as Zawody
	ON NrStartowy.Zawody_id = Zawody.Id
where Zawody.Active ='1'
order by Wyniki.Czas desc

ranking.jpg

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 225
0

Nie znam polskiego, więc mogłem czegoś nie zrozumieć, ale chodziło Ci chyba o to:

Kopiuj
CASE WHEN lap = 1 THEN ROW_NUMBER() OVER(PARTITION BY lap ORDER BY Czas) ELSE NULL END AS 'MSC OPEN'

Alternatywnie (nie we wszystkich bazach zadziała):

Kopiuj
IIF(lap = 1, ROW_NUMBER() OVER(PARTITION BY lap ORDER BY Czas),NULL) AS 'MSC OPEN'
RL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0
Fac napisał(a):

Nie znam polskiego, więc mogłem czegoś nie zrozumieć, ale chodziło Ci chyba o to:

Kopiuj
CASE WHEN lap = 1 THEN ROW_NUMBER() OVER(PARTITION BY lap ORDER BY Czas) ELSE NULL END AS 'MSC OPEN'

Alternatywnie (nie we wszystkich bazach zadziała):

Kopiuj
IIF(lap = 1, ROW_NUMBER() OVER(PARTITION BY lap ORDER BY Czas),NULL) AS 'MSC OPEN'

Bardzo dziękuje, rozwiązałeś mój problem!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.