2014-10-14 10 views
5

Primo post quindi per favore sii gentile. [SQL Server 2014]Ritorno colonna aggiuntiva con SELECT (max) T-SQL

Sono attualmente in esecuzione una selezione su una tabella, che si presenta come il seguito

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 

che restituisce 31 righe, una per ogni exerciseID mostra il valore più alto 'peso' per ciascuno di essi .

Quello che mi serve è una colonna aggiuntiva che mostra anche la data di ciascuna di queste righe. La colonna della data è già una colonna nella tabella delle sessioni di allenamento accanto a ciascuna riga.

Ho provato ad aggiungere questa colonna data, utilizzando il seguito:

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 

Ma questo poi restituisce 286 file - tutte le righe nella tabella padre. Ciò di cui ho bisogno è che i risultati della query originale siano relativi alla loro rispettiva data dalla tabella delle sessioni di allenamento.

Qualche idea?

Molte grazie

+0

qual è il tipo di dati di peso ?, perché stai primo convertendo di galleggiare e poi a decimale? – Lamak

+0

Complimenti per aver fatto una prima ragionevole domanda, non molti lo fanno! – Tanner

+0

@Lamak Il peso è varchar, stavo avendo difficoltà a convertirlo direttamente decimale e questa era una soluzione raccomandata. – Adam

risposta

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

con croce applicare

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

È necessario prima convertire il peso in numerico. Ordinamento di stringhe contenenti numeri e numeri stessi molto diversi. –

+0

Ciao Earl, molte grazie. Non ho usato cross application prima, quindi ne esaminerò di più, ma questo sembra aver fatto il trucco con un piccolo ritocco per convertire la colonna di peso. Anche se questo ha evidenziato che la conversione da char a decimale è molto complicata, andando a correggere l'input della colonna e cambiarlo in un tipo di dati più adatto. Grazie molto. – Adam

Problemi correlati