首页 > 解决方案 > 在几个表中聚合和访问特定数据的最佳方法是什么?

问题描述

我一直在努力处理 Postgres 查询,我认为我正在努力解决的高级问题是在同一查询中构建聚合和非聚合的最佳方式。

例如,假设我有一个公司列表。我想将 IBM 的收入除以其整个行业的总收入。这类查询导致我构建复杂的逻辑,我不确定这是否是最好的方法。

例如,如果我有这个查询:

select extract(year from fisy.date), 
(c.carbon/ln(fisy.totalrevenue- fisy.grossprofit)) as emissionsPerCOGS
from company."financials_Income_Statement_yearly" fisy 
join company.carbon c 
on lower(c.ticker) = lower(fisy.ticker)
where lower(fisy.ticker) = 'ibm.us'

这很好用,它给了我一年和每年的公式结果。

但是假设我有另一个表格,一般来说我有关于 ibm 的详细信息,我希望看到 IBM 的上述结果与他们的行业保持一致。我可以通过以下方式获取 where 语句的代码列表:

select lower(g4.ticker)
from "company"."General" g4
where industry = (
        select industry
        from "company"."General" g3
        where lower(g3.ticker) = 'ibm.us'
    )

但是在这一点上,我很困惑如果我将它包含在 where 语句中,那么所有选择结果都是针对聚合数据的,我会因为必须专门从中选择/过滤 IBM 的数据而感到困惑。

所以我的问题是,是否有一种直接的方法来获取聚合数据和单个(ibm 类型)数据,以便我可以在我的数据库中获取单个数据集并将其与一些聚合视图进行比较?

标签: sqlpostgresql

解决方案


例如,假设我有一个公司列表。我想将 IBM 的收入除以其整个行业的总收入。

这个问题陈述非常简单。我不知道您问题中的查询与此问题有什么关系。但你可以这样做:

select sum(revenue) filter (where company = 'IBM') / sum(revenue)
from t;

where如果您想将其限制为一组特定的公司,您可以添加一个子句。

或者,如果您希望所有公司都这样做:

select company, sum(revenue), sum(sum(revenue)) over ()
from t
group by company;

推荐阅读