我在DBT中使用postgresql,所以postgresql或DBT解决方案都是可行的。
我有一个基本上包含4列的表target, question, value, current
我可以用下式得到该值的百分位数(cume_dist
):
(cume_dist() over (partition by question order by value)) * 100 as percentile
但是,当前值为零的目标不在比较中,我需要它们的百分比,但它们不在“数据集”中(它们是来自相同目标的历史数据,因此它们不是当前值,但我需要百分比,就好像它们是当前值一样)
但是,我实际上需要current
为1的值子集中每个值的百分位数。
ETA:我在文档中看到cume_dist
可以接受参数,但是我没有找到任何关于这些参数代表什么或者如何使用它们的文档...
1条答案
按热度按时间42fyovps1#
重新实现cume_dist()
据我所知,用现有的
cume_dist()
函数无法做到这一点,但不用cume_dist()
实现相同的functionalify是相当容易的。postgres docs表示
cume_dist()
返回累积分布,即(当前行之前的分区行数或与当前行对等的分区行数)/(分区总行数)。因此,该值的范围从1/N到1。
下面是我如何设置我的演示数据:
下面是如何在不使用
cume_dist()
的情况下执行相同的操作(前面的行)/(总行数),并添加一些逻辑来排除不是当前的行:Here是此查询的一个小链接