我怎样才能做这个 SQL 查询(聚合分组依据和子句中的位置)?
How can I do this SQL query (aggregate group by and where in clause)?
这是问题的过度简化版本,我有 5 tables:项目 (~50K)、组织 (~20K)、类别、投标人 (~250K)、评级
Project (
id,
owner_id (Organization.id),
title
)
Organization (
id,
name
)
Category (
id,
name
)
Bidder (
id,
organization_id (Organization.id),
project_id (Project.id)
category_id (Category.id),
is_winner
)
Rating (
id,
bidder_a_id (Bidder.id),
bidder_b_id (Bidder.id),
bidder_a_is_winner,
bidder_b_is_winner
)
有组织对类别中的项目进行投标。投标人可以赢得或输掉他们对项目的投标,然后计算评级(获胜数/总数)。评级是在一个组织与另一个(或多个)组织之间计算的。
例如:
- 我们想显示一个项目的所有投标人的评级,仅包括与项目所有者相同的组织的项目的投标。
- 我们想显示一个项目类别中所有投标人的评级,仅包括对其他选定组织也隐含的项目的投标。
我知道评级 table 不是获得结果所必需的,但由于数据量大,执行查询会花费太多时间。因此,我创建了 Rating table 来保存在同一项目上工作的投标人的关联。如果两个投标人之前从未合作过,他们之间可能没有评级。
我会尝试更新我自己的看法,但我似乎还不能让它发挥作用...当他们没有评级时,我在结果中失去了投标人,我用 IN 子句过滤了选定的组织。
编辑: 我找到了解决问题的方法。我在内部查询中添加了一列,如果当前行在所选组织中,则 returns 为布尔值。当我做 SUM 时,那些不在的,不计入评分的计算中。
总而言之,当我尝试使用 HAVING 子句时,它会消除没有评级的行,但我仍然希望它们出现在最终结果中。我想知道它们是 0。
它看起来像这样(注意在 SELECT 中使用 IN 子句):
select
org.id,
sum(sub.nb_wins),
sum(sub.nb_total),
sum(sub.nb_wins) / sum(sub.nb_total)
from
(select
bid.id as bidder_id,
bid.category_id as category_id,
sum(
case rat.id is not null or rat.bidder_a_id in (...) then bid.is_winner else 0
) as nb_wins,
sum(
case rat.id is not null or rat.bidder_a_id in (...) then 1 else 0
) as nb_total
from
Bidder bid
left outer join
Rating rat on rat.bidder_b_id = bid.id
group by
bid.id,
bid.category_id) as sub
inner join
Organization org on org.id = sub.bidder_id
group by
sub.bidder_id,
sub.category_id
这是问题的过度简化版本,我有 5 tables:项目 (~50K)、组织 (~20K)、类别、投标人 (~250K)、评级
Project (
id,
owner_id (Organization.id),
title
)
Organization (
id,
name
)
Category (
id,
name
)
Bidder (
id,
organization_id (Organization.id),
project_id (Project.id)
category_id (Category.id),
is_winner
)
Rating (
id,
bidder_a_id (Bidder.id),
bidder_b_id (Bidder.id),
bidder_a_is_winner,
bidder_b_is_winner
)
有组织对类别中的项目进行投标。投标人可以赢得或输掉他们对项目的投标,然后计算评级(获胜数/总数)。评级是在一个组织与另一个(或多个)组织之间计算的。
例如:
- 我们想显示一个项目的所有投标人的评级,仅包括与项目所有者相同的组织的项目的投标。
- 我们想显示一个项目类别中所有投标人的评级,仅包括对其他选定组织也隐含的项目的投标。
我知道评级 table 不是获得结果所必需的,但由于数据量大,执行查询会花费太多时间。因此,我创建了 Rating table 来保存在同一项目上工作的投标人的关联。如果两个投标人之前从未合作过,他们之间可能没有评级。
我会尝试更新我自己的看法,但我似乎还不能让它发挥作用...当他们没有评级时,我在结果中失去了投标人,我用 IN 子句过滤了选定的组织。
编辑: 我找到了解决问题的方法。我在内部查询中添加了一列,如果当前行在所选组织中,则 returns 为布尔值。当我做 SUM 时,那些不在的,不计入评分的计算中。
总而言之,当我尝试使用 HAVING 子句时,它会消除没有评级的行,但我仍然希望它们出现在最终结果中。我想知道它们是 0。
它看起来像这样(注意在 SELECT 中使用 IN 子句):
select
org.id,
sum(sub.nb_wins),
sum(sub.nb_total),
sum(sub.nb_wins) / sum(sub.nb_total)
from
(select
bid.id as bidder_id,
bid.category_id as category_id,
sum(
case rat.id is not null or rat.bidder_a_id in (...) then bid.is_winner else 0
) as nb_wins,
sum(
case rat.id is not null or rat.bidder_a_id in (...) then 1 else 0
) as nb_total
from
Bidder bid
left outer join
Rating rat on rat.bidder_b_id = bid.id
group by
bid.id,
bid.category_id) as sub
inner join
Organization org on org.id = sub.bidder_id
group by
sub.bidder_id,
sub.category_id