【问题标题】:How does one avoid Join placing a constraint on aggregate function?如何避免 Join 对聚合函数施加约束?
【发布时间】:2017-05-13 19:53:30
【问题描述】:

[使用 postgres]

所以我的场景的背景是:

我正在尝试按用户活跃的年龄来获取平均费用 成本 = 40 33 岁的人中只有 2 人买过东西 我有 34 位 33 岁的活跃会员(无论他们是否付款与此计数无关) 考虑到这一点,每个年龄花费的钱 = 40 / 34 = 1.18 我现在得到的是 = 40 / 2 = 20 我知道它受到两个购买的用户的限制

那么我从哪里得到所有这些?

select date_part('year', age(birthday)) as age, 
avg(cost) 
from person
inner join payment on person.person_id = payment.person_id
inner join product on payment.product_id = product.product_id
where 
date_part('year', age(birthday))= 33 and user_state = 'active'
group by age


不幸的是,当使用聚合函数时(在本例中为 avg()) 似乎 avg() 受限于内部联接的结果(我尝试了左联接以保持对所有用户的访问,它似乎不起作用,因为我仍然得到了不希望的结果 20)。有没有办法避免这种情况?换句话说,我可以让 avg() 调用特定于我的 person 表,而不是连接的结果吗?

如果重要的话,这就是我检索总和的方式。

select sum(cost) 
from person
inner join payment on person.person_id = payment.person_id
inner join product on payment.product_id = product.product_id
where 
date_part('year', age(birthday))= 33 
and 
user_state = 'active'

= 40

显而易见的是计算我想要的人数,然后分别进行总和,但我试图避免从一个查询转到另一个查询。

【问题讨论】:

  • 请编辑您的帖子以使用完整清晰的句子。我们如何解析你的第一句话?什么是“受两个用户约束”和“受内部连接结果约束”?您以非标准的方式使用“约束”来模糊地总结您没有解释的内容。与“特定于我的人员表”相同。 “从一个查询转到另一个查询”是什么意思?我们可以从正确的解决方案中猜出你应该写什么,但你没有表达出来。但清楚地表达自己是寻找解决方案的一部分。 PS 在嵌套连接中添加一列,以获取您在它之外需要的内容。

标签: postgresql inner-join aggregate-functions


【解决方案1】:

avg 将跳过空值,因此将这些空值合并为零并显然左连接:

select 
    date_part('year', age(birthday)) as age, 
    avg(coalesce(cost,0)) 
from 
    person
    left join 
    payment on ...
    left join
    product on ...

【讨论】:

    猜你喜欢
    • 2015-11-26
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多