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影响。

最后结果形如:



留言

熱門文章