如何从一列中计算过去 X 周数据的百分比?
Posted
技术标签:
【中文标题】如何从一列中计算过去 X 周数据的百分比?【英文标题】:How to calculate percentage from one column for past X weeks of data? 【发布时间】:2021-01-15 22:06:33 【问题描述】:我有一个包含以下列的表格:
week_number client_id status
以下是每列的含义:
week_number has values like 'W1', 'W2' ... 'W53'.
client_id has values with numbers in it.
status has two values only 'accepted' and 'rejected'.
现在我需要每周进行以下计算,并获取过去 6 周(不包括当前周)的百分比以及每周分组。
find count of 'status' column which are 'accepted' for each week.
-------------------------------------------------------------------
find count of 'status' which are both 'accepted' and 'rejected' for each week.
所以我需要的输出应该是这种格式:
week_number percentage
W1 5.1%
W53 15.9%
W52 2.5%
W51 11.0%
W50 13.6%
W49 19.4%
这有可能做到吗?我试过这样,但这不起作用,而且我不想在这里使用limit
子句来获取过去 6 周的数据。有没有什么方法可以在不使用任何限制子句的情况下有效地做到这一点?
select
week_number,
((select count(status) from event_information where status in ('accepted')) / count(status)) * 100 as percentage
from event_information
group by 1
order by len(week_number) desc, week_number desc
limit 6;
【问题讨论】:
您的周数不明确。您如何确定年份? 年份将是我们正确的年份,并基于过去 6 周的计算结果? 那么数据中就不会有 W52。它还没有发生。 我需要过去 6 周,所以当前周是 2,所以现在我们可以自动回到过去 6 周,从当前周计算可以是 1、53、52、51、50、49?不?还是我理解错了? 【参考方案1】:你可以像这样使用聚合:
select week_number,
avg(case when status = 'accepted' then 100.0 else 0 end) as accepted_ratio
from event_information
group by week_number
order by week_number desc
limit 6;
100.0
是获取 0 到 100 之间的值。我更喜欢 0 到 1 之间的比率(我会使用 1.0)。
请注意,“过去六周部分”是一个字符串,因为您没有提到“年份”列。根据您的评论,该列中有一个真实的日期,因此您可以使用order by min(client_date) desc
获得正确的排序。
【讨论】:
我尝试了这个查询,但在过去的 6 周内我都将accepted_ratio
设为 0。有什么想法吗?
我刚刚意识到有一个名为client_date
的列,格式为2021-01-18 00:00:00.0
,其中包含日期。我们现在可以使用它来执行此操作吗?
对我为什么得到 0 有什么想法吗?
@AndyP 。 . .这很奇怪。 Postgres 以小数形式计算 int 的平均值;我认为 Redshift 也是如此。只需将其转换为数字或浮点数。
我现在试过了,但我得到一个错误 - cannot cast type boolean to numeric
。以上是关于如何从一列中计算过去 X 周数据的百分比?的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用gt包和gtExtras包优雅地漂亮地显示表格数据:使用gtExtras包添加一个图,显示表中某一列中的数字并自定义表格数据显示的主题格式并自定义数值数据的格式(例如百分比)