SQL:按包括所有 table 列的结果进行分组的有效方法
SQL: Efficient way to get group by results including all table columns
下面让我们考虑一个简单的table。
id
code
marks
grade
1
X
100
A
2
Y
120
B
3
Z
130
A
4
X
120
C
5
Y
100
A
6
Z
110
B
7
X
150
A
8
X
140
C
目标: 获得每个年级的最高分,return 所有列。
id
code
marks
grade
7
X
150
A
2
Y
120
B
8
X
140
C
如果我不想要 id
和 code
列,这很简单
select grade, max(marks)
from table
group by grade;
在上述查询中获取 id
和 code
列的最有效查询是什么?
我试过类似的东西,但没有用
select * from table t
inner join
(select grade, max(marks)
from table
group by grade) a
on a.grade=t.grade;
您在寻找相关子查询吗?
select t.*
from t
where t.marks = (select max(t2.marks) from t t2 where t2.grade = t.grade);
在 Postgres 中,这种查询最有效的方法是使用(专有的)distinct on ()
select distinct on (grade) *
from the_table t
order by grade, marks desc;
下面让我们考虑一个简单的table。
id | code | marks | grade |
---|---|---|---|
1 | X | 100 | A |
2 | Y | 120 | B |
3 | Z | 130 | A |
4 | X | 120 | C |
5 | Y | 100 | A |
6 | Z | 110 | B |
7 | X | 150 | A |
8 | X | 140 | C |
目标: 获得每个年级的最高分,return 所有列。
id | code | marks | grade |
---|---|---|---|
7 | X | 150 | A |
2 | Y | 120 | B |
8 | X | 140 | C |
如果我不想要 id
和 code
列,这很简单
select grade, max(marks)
from table
group by grade;
在上述查询中获取 id
和 code
列的最有效查询是什么?
我试过类似的东西,但没有用
select * from table t
inner join
(select grade, max(marks)
from table
group by grade) a
on a.grade=t.grade;
您在寻找相关子查询吗?
select t.*
from t
where t.marks = (select max(t2.marks) from t t2 where t2.grade = t.grade);
在 Postgres 中,这种查询最有效的方法是使用(专有的)distinct on ()
select distinct on (grade) *
from the_table t
order by grade, marks desc;