按列分组并计算百分比,windows函数分区
Posted
技术标签:
【中文标题】按列分组并计算百分比,windows函数分区【英文标题】:Grouping by column and calculating percentage, windows function partition by 【发布时间】:2021-04-16 10:55:06 【问题描述】:我有以下示例表“发票”。
+----------------+-------------+--------+
| invoice_number | date | status |
+----------------+-------------+--------+
| 1 | 2 apr 2021 | 1 |
+----------------+-------------+--------+
| 2 | 9 apr 2021 | 0 |
+----------------+-------------+--------+
| 3 | 9 apr 2021 | 1 |
+----------------+-------------+--------+
| 4 | 9 apr 2021 | 1 |
+----------------+-------------+--------+
| 5 | 16 apr 2021 | 1 |
+----------------+-------------+--------+
| 6 | 16 apr 2021 | 0 |
+----------------+-------------+--------+
| 7 | 16 apr 2021 | 0 |
+----------------+-------------+--------+
| 8 | 16 apr 2021 | 0 |
+----------------+-------------+--------+
| 9 | 16 apr 2021 | 1 |
+----------------+-------------+--------+
(在状态中,1 表示已付款,0 表示未付款) 并从中我试图得到以下信息:
每周的发票数量(每个日期为一周,因此每个日期一组有效) 这些发票已支付的百分比(按日期分组)我试图使用窗口函数来更好地组织(因为我有更多的字段,这只是为了示例而简化)
我在做
select date,
count(invoice_number) over (partition by date) as NumberOfInvoices,
(sum(status)/count(status) over (partition by date))*100 as percentagePaid
from invoices
但这当然行不通,同时我得到了表的所有行作为结果,而不是按日期分组。
我应该停止尝试使用这里的过度分区吗?还是我只是错误地应用它来满足我的需要?
【问题讨论】:
样本数据很好,但您也应该指定预期的结果。 【参考方案1】:已支付的这些发票的百分比(按日期分组)
这只是聚合:
select date, avg(status * 1.0) as paid_ratio
from invoices i
group by date;
如果您想要每行,那么您将使用窗口函数:
select i.*,
avg(i.status * 1.0) over (partition by i.date) as paid_ratio
from invoices i;
注意* 1.0
。 SQL Server 对整数进行整数除法和平均。 status
看起来像一个整数,因此 * 1.0
将其转换为带小数位的数字。
【讨论】:
天哪,真快!谢谢你!是的,我想我会在这里用聚合来做,一个问题,如果我只有 1 和 0,这里的平均值是有效的,因为它是对总分组的平均值,对吗?例如,如果我有其他状态,例如 2 表示拒绝,3 表示已纠正,我可以使用 CASE 将它们转换为 1 和 0,以便我可以使用平均值? @Baldie47 。 . .是的,经常使用case
:avg(case when status = 1 then 1.0 else 0 end)
。
非常感谢,这解决了我在这里的所有问题 :) 顺便说一句,题外话,你建议从欧洲哪里买书? (您获得更好的百分比交易)
@Baldie47 。 . .我希望它可以在亚马逊或任何其他在线书店买到。以上是关于按列分组并计算百分比,windows函数分区的主要内容,如果未能解决你的问题,请参考以下文章
python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)