【问题标题】:SQL: aggregate function in select statement with a join involving group by clauseSQL:选择语句中的聚合函数,其中包含涉及 group by 子句的连接
【发布时间】:2017-10-08 20:05:33
【问题描述】:

我有两个具有以下属性的表:

t1                               t2
source    domain     date           rank     domain     date 
---       ---        ---            ---      ---        ---
A        google    2008-10-24        1      google    2007-10-20
A        facebook  2010-05-17        1      google    2009-02-21
B        google    2007-05-14        2      facebook  2008-04-13
B        google    2012-01-05        2      facebook  2012-09-12
B        facebook  2014-03-23        2      facebook  2015-04-01  

我试图找出日期差异 b/w 每个 domaint2 中的第一次(最早)出现与它们在t1 中的第一次出现(基于date)。

以下查询给了我所需的结果:

select t2.domain, datediff(min(t1.date),min(t2.date)) 
from t1 join t2 
on t1.domain = t2.domain 
group by t2.domain

现在,如果我想计算所有域的平均日期差异(仅针对它们的第一次出现),这部分会在 select 语句中给出错误(查询的其余部分与上面相同):

select avg(datediff(min(t1.date),min(t2.date))) ...

知道如何在此处纠正错误(无效使用组功能)吗?
另外,我想通过source 计算平均日期差异组。这样输出应该是这样的:

source     avg_datediff 
---        ---
A          some_value 
B          some_value 

就像上面一样,对于给定来源中的多个相同域,在计算平均日期差异时,我只需要考虑该来源的最早域的日期。

【问题讨论】:

    标签: mysql sql join group-by aggregate-functions


    【解决方案1】:

    使用子查询:

    select avg(days)
    from (select t2.domain, datediff(min(t1.date), min(t2.date)) as days 
          from t1 join
               t2 
               on t1.domain = t2.domain 
          group by t2.domain
         ) tt;
    

    【讨论】:

    • 谢谢,它成功了。对于我的第二个查询,您是否也建议使用子查询?
    • @Saadh 。 . .你真的应该在每个问题中只问一个问题。我认为构造是avg(datediff(t1.date, t2.date)
    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2019-05-17
    • 2016-08-23
    • 2022-01-14
    • 1970-01-01
    • 2019-10-23
    • 2022-10-25
    相关资源
    最近更新 更多