Select group by 子句中的前 1 列值?

Select top 1 column value in the group by clause?

我正在加入两个 table,我的查询包含 group by 子句。我想在结果中显示的联接 table 中有一列,但不希望它成为分组依据的一部分,因为列值中的值不同。我只想显示该列的任何最高值。

我尝试使用 Distinct 和 Top 1 以及其他的,但对我没有用。

SELECT t1.Code, t2.Details, t2.FineDate ,Sum(t1.Amount) from Emp_Actions t1 
INNER JOIN Emp_Fines  ON  t1.Code =  t2.Code 
where (t1.Code = "MYParameter" or @MyParameter = "" )
group by t1.Code,t2.Details,t2.FineDate

请注意,我使用的是 StoredProcedure 并且代码是特定的或全部的。我的实际查询太大,我只是做了一个示例来详细说明我的问题。我需要 Top 1 FineDate,我不希望它成为分组依据的一部分,但是我想显示它。

一种只获取一个值的方法是在 SELECT 语句中使用 MAX(col) 或 MIN(col),其中 col 是您不想分组的列。一个优点是您获得的值有些一致(按顺序排在第一位或最后一位)。

SELECT t1.Code, t2.Details, t2.FineDate, MAX(col) my_col, 求和( t1.Amount) 来自 Emp_Actions t1

此外,还有更高级的分析 window 函数(例如 first_value),如果您想这样做,可以更好地控制选择哪个值,也取决于其他列值。

https://docs.microsoft.com/en-us/sql/t-sql/functions/analytic-functions-transact-sql?view=sql-server-2017

您可以使用子查询来获得所需的结果。

我给你一个示例代码:

Select
t1.Code, t2.Details, t2.FineDate,Sum(t1.Amount) 
,(select top 1 a.ColA from Emp_Fines a where a.Code = t1.Code order by ColOfSort Asc/Desc) as RequiredColumn
from Emp_Actions t1 
INNER JOIN Emp_Fines t2 ON  t1.Code =  t2.Code 
where (t1.Code = "MYParameter" or @MyParameter = "" )
group by t1.Code,t2.Details,t2.FineDate

其中 RequiredColumn 是您想要在结果中但不想在分组依据中使用的列

使用MIN()MAX():

select t1.Code, t2.Details, t2.FineDate, Sum(t1.Amount),
       max(<your column here>) as column+name
from Emp_Actions t1 join
     Emp_Fines  
     on  t1.Code = t2.Code 
where (t1.Code = "MYParameter" or @MyParameter = "" )
group by t1.Code, t2.Details, t2.FineDate