2014-10-14 9 views
5

Pierwszy wpis, więc proszę bądź miły. [SQL Server 2014]Zwrot dodatkowej kolumny za pomocą SELECT (max) T-SQL

Jestem obecnie pracuje select na tabeli, która wygląda jak poniżej

select 
ExerciseCultures.Name, 
max (convert (decimal (10,2), cast(weight as float))) as [Max Weight (KG)] 
from workoutsessions 
     join ExerciseCultures on workoutsessions.ExerciseID 
     = ExerciseCultures.ExerciseID 
group by ExerciseCultures.Name 

która zwraca 31 wierszy, po jednym dla każdej exerciseID wykazujące najwyższą „waga” wartość dla każdego z nich .

Potrzebuję dodatkowej kolumny z datą każdego z tych wierszy. Kolumna daty jest już kolumną tabeli ćwiczeń treningowych obok każdego wiersza.

Próbowałem dodając tę ​​kolumnę dat, stosując poniżej:

select 
ExerciseCultures.Name, 
max (convert (decimal (10,2), cast(weight as float))) as [Max Weight (KG)], 
workoutsessions.date 
from workoutsessions 
     join ExerciseCultures on workoutsessions.ExerciseID 
     = ExerciseCultures.ExerciseID 
group by ExerciseCultures.Name, 
    workoutsessions.date 

Ale ta następnie powraca 286 rzędy - wszystkie wiersze w tabeli nadrzędnej. Potrzebuję oryginalnych wyników zapytania z odpowiednią datą z tabeli ćwiczeń.

Jakieś myśli?

Dziękujemy

+0

jaki jest typ danych wagi ?, dlaczego najpierw przekształcenie go unosić, a następnie na dziesiętny? – Lamak

+0

Dobrze zrobione za zadawanie rozsądnego pierwszego pytania, niewielu robi! – Tanner

+0

@Lamak Waga to varchar, miałem trudności z konwersją bezpośrednio dziesiętnie i było to zalecane rozwiązanie. – Adam

Odpowiedz

1
SELECT A.NAME, 
     A.[max weight (kg)], 
     B.date 
FROM (SELECT exercisecultures.NAME, 
       Max (CONVERT (DECIMAL (10, 2), Cast(weight AS FLOAT))) AS [Max Weight (KG)] 
     FROM workoutsessions 
       JOIN exercisecultures 
       ON workoutsessions.exerciseid = exercisecultures.exerciseid 
     GROUP BY exercisecultures.NAME) A 
     JOIN workoutsessions B 
      ON a.NAME = b.NAME 
      AND CONVERT (DECIMAL (10, 2), Cast(B.weight AS FLOAT)) = 
       A.[max weight (kg)] 
2
;WITH CTE AS 
(
    SELECT e.Name, 
      CONVERT(DECIMAL(10,2),CAST(weight AS FLOAT))) [Max Weight (KG)], 
      w.[date], 
      RN = ROW_NUMBER() OVER(PARTITION BY e.name 
            ORDER BY CONVERT(DECIMAL(10,2),CAST(weight AS FLOAT))) DESC) 
    FROM workoutsessions w 
    INNER JOIN ExerciseCultures e 
     ON w.ExerciseID = e.ExerciseID 
) 
SELECT name, [Max Weight (KG)], [date] 
FROM CTE 
WHERE RN = 1 
1

Z KRZYŻA DOTYCZĄCE

SELECT 
    ExerciseCultures.Name, 
    ws.[weight], 
    ws.[date] 
FROM ExerciseCultures 
    CROSS APPLY (SELECT TOP 1 [weight], [date] 
       FROM workoutsessions 
       WHERE ExerciseCultures.ExerciseID = ExerciseID 
       ORDER BY [weight] desc) ws 
+0

Najpierw należy przekonwertować wagę na numeryczną. Kolejność ciągów zawierających numery i same liczby są bardzo różne. –

+0

Witam Earl, wielkie dzięki. Nie stosowałem jeszcze zastosowania krzyżowego, więc przyjrzymy się temu więcej, ale wydaje się, że udało się to z odrobiną podkręcania, aby przekonwertować kolumnę wagi. Chociaż to podkreśliło, że konwersja z char na dziesiętny jest bardzo niechlujna - poprawi wprowadzanie kolumny i zmieni ją na lepiej dopasowany typ danych. Wielkie dzięki. – Adam

Powiązane problemy