非常常见的问题,在 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
目标是获得顶部 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