计算累计总数和达到特定阈值的日期 SQL

Calculating Cumulative Totals and Date that a Certain Threshold is Reached in SQL

我有一个简单的 table,包含人物、日期和数量:

Person    Date     Qty
Jim     08/01/16    1
Jim     08/02/16    3
Jim     08/03/16    2
Jim     08/04/16    1
Jim     08/05/16    1
Jim     08/06/16    6
Sheila  08/01/16    1
Sheila  08/02/16    1
Sheila  08/03/16    1
Sheila  08/04/16    1
Sheila  08/05/16    1
Sheila  08/06/16    1

我想计算两列:累计总计和占总计的百分比,结果如下 table:

Person    Date    Qty cum tot  pct of tot
Jim     08/01/16   1    1         7%
Jim     08/02/16   3    4        29%
Jim     08/03/16   2    6        43%
Jim     08/04/16   1    7        50%
Jim     08/05/16   1    8        57%
Jim     08/06/16   6   14       100%
Sheila  08/01/16   1    1        17%
Sheila  08/02/16   1    2        33%
Sheila  08/03/16   1    3        50%
Sheila  08/04/16   1    4        67%
Sheila  08/05/16   1    5        83%
Sheila  08/06/16   1    6       100%

对于这个数据集,我想确定每个人的总百分比达到 50%(或我提供的任何其他百分比)的日期。

所以 50% 阈值的输出将是:

Jim     08/04/16
Sheila  08/03/16

关于我如何计算这两列并确定合适的日期有什么建议吗?

您可以使用ANSI标准的累计和函数来计算累计和。剩下的真的只是算术:

select t.*
from (select t.*,
             sum(qty) over (partition by person order by date) as running_qty,
             sum(qty) over (partition by person) as tot_qty,
             (sum(qty) over (partition by person order by date) * 1.0 / 
              sum(qty) over (partition by person)
             ) as running_percent
      from sales t
     ) t
where running_percent >= 0.5 and
      running_percent - (qty * 1.0 / tot_qty) < 0.5;

where 子句有两个条件的原因是 return 一行。第一个将 return 所有大于或等于 0.5 的行,但您只需要第一个 - 百分比超过阈值的位置。

* 1.0是因为有些数据库做整数除法。