我怎样才能做这个 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
)

有组织对类别中的项目进行投标。投标人可以赢得或输掉他们对项目的投标,然后计算评级(获胜数/总数)。评级是在一个组织与另一个(或多个)组织之间计算的。

例如:

  1. 我们想显示一个项目的所有投标人的评级,仅包括与项目所有者相同的组织的项目的投标。
  2. 我们想显示一个项目类别中所有投标人的评级,仅包括对其他选定组织也隐含的项目的投标。

我知道评级 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