按列分组并计算百分比,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 。 . .是的,经常使用caseavg(case when status = 1 then 1.0 else 0 end) 非常感谢,这解决了我在这里的所有问题 :) 顺便说一句,题外话,你建议从欧洲哪里买书? (您获得更好的百分比交易) @Baldie47 。 . .我希望它可以在亚马逊或任何其他在线书店买到。

以上是关于按列分组并计算百分比,windows函数分区的主要内容,如果未能解决你的问题,请参考以下文章

每天按列和行、计数和百分比分组

将数据框与其他数据框合并并根据特定条件计算分组百分比

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

重学SQL窗口函数

oracle分组求和并求百分比

检查分区已使用空间占总空间的百分比并发送告警邮件