非常常见的问题,在 MySQL 中非常简单的查询,但在 Microsoft SQL 中没有那么多

Very common problem, very simple query in MySQL, but no so much in Microsoft SQL

目标是获得顶部 activity 每个 activity 花费太多时间:

在mysql中应该很简单:

select description, reference, person, max(minutes)
group by description

结果应带回:

Description Reference Person Minutes
Activity A AA32343 Abe 10
Activity B BB34345 Boris 8
Activity C CCsdeee John 12

但在 Microsoft SQL 中,它不会 运行,因为分组依据并不包含 select...

中的所有列

什么等同于 MS SQL 中的 mysql 查询?如果我在分组依据中添加我需要的所有列,我将得到所有行,这不是我想要的

这是一个非常常见的问题,有人可以找到答案和 post 查询并以答案可以应用于几乎所有类似问题的方式进行解释吗?

table 中的行具有如下信息:

Description Reference Person Minutes
Activity A AA32343 Abe 10
Activity A AA77340 Wilson 9
Activity A AA56341 Carl 4
Activity B BB34345 Boris 8
Activity B BB94342 Jane 6
Activity B BB64343 Martha 3
Activity C CCsdeee John 12
Activity C CCs5ee4 Peter 10
Activity C CCskee5 Saul 4

使用row_number():

select * from (select description, reference, person, minutes,
row_number() over(partition by description order by minutes desc) rn from table_name
) a where rn=1

实际上您在 MySQL 中进行的查询分组无效。例如,您如何决定 'Activity A' 的引用 'AA32343'?可能只是忽略它来自哪一行。然后您也可以简单地在这些列上使用聚合:

select description, min(reference) reference, min(person) person, max(minutes)
from myTable
group by description;

或者,如果您的意思是这些字段来自具有最大(分钟)的行,则:

select t.*
from myTable t
inner join (
select description, max(minutes) maxMin
from myTable
group by description) tmp on t.description = tmp.description and t.Minutes = tmp.maxMin;

使用 analytic window function

with cte as

(select *, max(minutes) over (partition by description) as max_minutes
 from your_table)


select description, reference, person, minutes
from cte
where minutes=max_minutes;

这里的问题是您省略了元素,因为您似乎并不关心为每个分组显示哪个 Reference 和 Person。

获得所需结果的一种方法是使用 CTE 获取每个描述的最大分钟数,然后附加其他列。 对于这个例子,我得到了第一个 Reference 和 Person 按 Description:

排序
;with cte as
(
select  Description, 
        Minutes = max(Minutes)
from myTable MT
group by Description
)
Select  C.Description,
        R.Reference,
        R.Person,   
        C.Minutes
From cte C
Cross Apply
(
    Select top 1    T.Reference,
                    T.Person
    From myTable T
    where T.Description = C.Description
    order by T.Description
) R