[英]GROUP BY and uniqueness in multiple columns
可以说,我希望从一些联接表中选择3列:event_id,home_team和聚合函数的结果。 event_id是自动递增的主键。 对于表中的每个记录,home_team并非唯一。 我想按event_id分组以生成聚合函数,然后按采用最高3个值的聚合函数的结果进行排序。 但是我也希望home_team是唯一的。 我怎样才能做到这一点? 我不能执行DISTINCT,因为记录将包含home_team,event_id和聚合函数的结果。 event_id将始终是唯一的,因此我的DiSTINCT查询不执行任何操作。
我必须按event_id进行分组,因为聚合函数取决于此,因此我无法按home_team进行分组。 如果我按两者分组,那将无济于事,因为...
例
Table 1
id: 1
event_id: 1
value: 2
id 2
event_id: 1
value: 6
id 3
event_id: 2
value: 4
id4
event_id: 2
value: 3
id5
event_id: 3
value: 1
表2
event_id (PK, autoincremented): 1
home_team: 1
event_id: 2
home_team 2
event_id: 3
home_team: 1
SELECT *, AVG(table1.value) as average FROM table1 JOIN table2 ON table1.event_id = table2.event_id GROUP BY table2.event_id ORDER BY average DESC
我需要按table2.event_id分组,以生成正确的聚合函数结果。 但是,我也希望home_team是与众不同的,因此所需的输出将是带有event_id 1和event_id 2的两个结果
好吧,可以肯定的是,由唯一键分组的聚合函数不会为您做很多事情。 听起来当您真正想要的只是每个home_team
值最高的三个事件时,您就陷入了分组的想法。
尝试这样的事情,而不是:
select
event_id,
home_team,
value
from
my_tbl t
where
event_id in
(select event_id from my_tbl
where home_team = t.home_team
order by value desc limit 0,3)
更新:您的编辑清除了一些内容,所以去了:
select
(select min(event_id) from table2 where home_team = t2.home_team) as event_id,
t2.home_team,
avg(t1.value) as average
from
table1 t1
inner join table2 t2 on
t1.event_id = t2.event_id
group by
t2.home_team
您所描述的完全是荒谬的。 您想按event_id
分组,然后只显示一个home_team
? 除非您希望占据home_team
行:
select
home_team,
max(average) as topavg
from
(
select
t2.event_id,
t2.home_team,
avg(t1.value) as average
from
table1 t1
inner join table2 t2 on
t1.event_id = t2.event_id
group by
t2.event_id, t2.home_team
) as a
group by
home_team
用这个:
GROUP BY event_id, home_team
这将仅对具有相同event_id和相同home_team的记录进行分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.