使用SELECT(max)T-SQL返回额外的列

时间:2014-10-14 15:53:07

标签: sql sql-server tsql sql-server-2014

第一篇文章所以请你好。 [SQL Server 2014]

我正在针对一个类似于下面的

的表运行select
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

返回31行,每个exerciseID对应一行,显示每个行的最高“权重”值。

我需要的是一个附加列,它还显示每个行的日期。日期列已经是每个行旁的workoutsessions表中的一列。

我尝试使用以下内容添加此日期列:

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

但是这会返回286行 - 父表中的所有行。我需要的是原始查询结果,只有他们各自的日期来自exercisesessions表。

有什么想法吗?

非常感谢

3 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:1)

使用CROSS APPLY

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