impala SQL分组求频数和频率
SELECT run_date
,category_field
,COUNT(*)
,count(*) over()
,count(*) over(PARTITION BY run_date)
,SUM(count(*)) over(PARTITION BY run_date) total_count
,round(COUNT(*)/SUM(count(*)) over(PARTITION BY run_date),4) AS ratio
-- ,round(ratio_to_report(COUNT(*)),2)
FROM table
GROUP BY run_date,category_field
ORDER BY run_date,category_field
run_date 假设是跑授信的日期
category_field 假设是不同的门店
现在需按日求每个门店的跑授信的客户数
频数很简单
group by run_date,category_field,然后count(*)
现在需要每日求不同门店申请数的按日占比,即频率
round(COUNT(*)/SUM(count(*)) over(PARTITION BY run_date),4) AS ratio
这里要利用over子句,这里聚合函数SUM就充当了一个窗口函数,在每一个run_date上进行sum,count(*)仍然按照group by的分组进行正常聚合。
这里在进行一些扩展
count(*) over()是聚合后的数据集,求记录数
count(*) over(PARTITION BY run_date)是聚合后的数据集,分组求count
SUM(count(*)) over(PARTITION BY run_date) total_count 即ratio的分母
注:这里不能简单地认为外层分析函数(聚合函数是其中一种)是和over进行的配合,比如
round(COUNT(*)/SUM(count(*)) over(PARTITION BY run_date),4) AS ratio
这里SUM是和over配合,但分子COUNT(*)并不受over影响。
最后结果形如:
留言
張貼留言