【问题标题】:SQL - Finding largest period of activity by customerSQL - 按客户查找最大活动期
【发布时间】:2014-03-31 11:02:59
【问题描述】:

标题让我很难过,希望这更清楚一点......

我有一个这样的数据表(简化);

日期        客户 金额
2014 年 1 月 1 日 1               100.5   
2014 年 4 月 4 日 1               122.5   
2014 年 2 月 1 日 3               3.25     

...但只差一百万条记录。

我想为每个总金额最大的客户找出 x 天(假设是 90)的时间段。

考虑到所有客户的所有交易,为了稍微不同地解决问题,对于每个客户,我想找到总金额最大的 90 天期间以及该期间内的总金额。

试图建议一种蛮力方法,我定义所有可能的范围(或在运行中迭代所有可能的范围)。

对更优雅的解决方案有什么想法吗?

【问题讨论】:

    标签: sql tsql sql-server-2008-r2 aggregate aggregation


    【解决方案1】:

    您可以为此使用自联接,但性能可能不是那么好:

    select t.*,
           (select sum(t2.amount)
            from table t2
            where t2.customer = t.customer and
                  t2.date >= dateadd(day, -90, t.date) and t2.date <= t.date
           ) as amount90
    from table t;
    

    SQL Server 2012 中有一种更高效的方法。

    【讨论】:

    • 感谢 Gordon,2012 年更有效的方法是什么,可能只是将数据拉到 2012 年的实例中。
    【解决方案2】:

    这是一种我认为可行的伪代码式答案。不过可能真的很慢。

    你可以有一个函数来计算活动的数量,提供开始日期和天数,

    --function F
    @userid, @startdate, @dayCount
    SELECT COUNT(*)
    FROM TABLE 
    WHERE 
    UserID = @userid
    and date > @startDate
    and date < Dateadd(@startdate, @dayCount)
    

    然后在那个函数上做一个最大值?

    select max(f(user, date)) 
    from TableContainingDateRanges
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2012-07-15
      • 2021-07-01
      • 2021-06-21
      • 2022-08-16
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多