计算累计总数和达到特定阈值的日期 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
是因为有些数据库做整数除法。
我有一个简单的 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
是因为有些数据库做整数除法。