【问题标题】:Getting total average between dates获取日期之间的总平均值
【发布时间】:2017-03-01 02:30:26
【问题描述】:

我有一个名为sales 的表格,格式如下。

sale_id         user_id          sale_date              sale_cost
j847bv-6ggd     bd48ta36-cn5x    2017-01-10 15:43:12    30
vf87x2-15gr     bd48ta36-cn5x    2017-01-05 13:41:16    60
3gfd7f-2cdd     8g4f5ccf-1fet    2017-01-15 14:10:12    100
4bgfd5-12vn     8g4f5ccf-1fet    2017-01-20 19:47:14    20
b58e32-bf87     8g4f5ccf-1fet    2017-01-20 17:35:13    15
bg87db-127g     gr4gg1f4-3gbb    2017-01-20 12:26:15    80

如何获取用户 (user_d) 自首次购买后前 X 天内的平均消费金额?我不想要每个用户的平均值,而是所有用户的总平均值。

我知道我可以使用 select avg(sale_cost) 获得平均值,但我不确定如何找出某个日期期间的平均值。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以从初始销售日期算起的 10 天内找到每个用户的平均总数,如下所示:

    select avg(sale_cost)
    from (
        select sum(t.sale_cost) sale_cost
        from your_table t
        join (
            select user_id, min(sale_date) start_date, date_add(min(sale_date), interval 10 day) end_date
            from your_table
            group by user_id
            ) t2 on t.user_id = t2.user_id
            and t.sale_date between t2.start_date and t2.end_date
        group by t.user_id
        ) t;
    

    它会为每个用户找到第一个 sale_date 和 10 天后的日期。然后将其与表格相连接,得到该范围内每个用户的总数,最后对上述计算的总数取平均值。

    Demo

    如果您想找到第一次销售日期(不是个人)和之后 10 天之间的平均值,请使用:

    select avg(sale_cost)
    from (
        select sum(t.sale_cost) sale_cost
        from your_table t
        join (
            select min(sale_date) start_date, date_add(min(sale_date), interval 10 day) end_date
            from your_table
            ) t2 on t.sale_date between t2.start_date and t2.end_date
        group by t.user_id
        ) t;
    

    Demo

    【讨论】:

    • 我不希望 date1date2 被硬编码。理想情况下,我希望 date1 成为 sale_datedate2 距离 date1 10 天
    • @Someguywhocodes - 添加了另一个解决方案。可能这就是你正在寻找的。请检查?
    • 我相信第一个答案正是我想要的,但第二个也很有用!我似乎在选择费用时遇到问题,请参阅here。查询看起来不错,所以我不确定是什么原因造成的,因为该列确实存在。
    • @Someguywhocodes - 一开始就在查询中使用avg(sale_cost),因为您在子查询中给出了别名。或将别名从sale_cost 更改为paid_amount
    【解决方案2】:

    between 运算符在检查范围时会派上用场

    SELECT column_name(s)
    FROM table_name
    WHERE column_name BETWEEN value1 AND value2;
    

    在这种情况下,value1 和 value2 将被您的日期替换为:

    '2011-01-01 00:00:00' AND '2011-01-31 23:59:59'
    


    sale_date AND DATE_ADD(OrderDate,INTERVAL 10 DAY) 第一种方法更快,而且值之间也包含在内。

    【讨论】:

    • 这行得通,而且比@GurV 的答案简单得多,有区别吗?
    • 这个答案很糟糕,因为它从不计算平均值
    • 我刚刚注意到这一点!谢谢,现在就试试你的答案。
    • 这是编写代码的唯一方式,而且我相信尽可能简化代码的呈现方式。如果合适,请单击左侧的勾号标记为已回答,以便其他人也可以从您的查询中受益。此代码仅显示了所需的 between 运算符的用法,而不是用于查找 avg 的代码,因为用户已经知道如何很好地计算平均值
    • 问题是求两个日期之间的总平均值,而这个答案只给出两个日期之间的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多