【问题标题】:How do I aggregate columns and calculate a cumulative sum in SQL (mutate() and cumsum() in R)如何聚合列并计算 SQL 中的累积总和(R 中的mutate() 和 cumsum())
【发布时间】:2021-07-26 09:08:26
【问题描述】:

数据如下:

road_id count centimeters
road111 123 502
road123 345 234
road124 3256 23498

我的目标是计算“量公里流量”,计算每行的百分比,按计数排序,并计算累积总和。我知道如何在 R 中做到这一点,但很难在 SQL 中重现。

为了实现这一点,我在 R 中的代码是(它可以正常工作):

data_perc <- data %>% 
             mutate(kilometers = centimeters/100000) %>%
             mutate(vkt = count*kilometers) %>%
             mutate(vktperc = vkt/sum(vkt)) %>%
             arrange(desc(count)) %>%
             mutate(vktcumsum = cumsum(vktperc))

在 SQL 中,我尝试了这个但出现了错误:

select road_id, count, geom, centimeters/100000 as kilometers, cap1.y as vkt, cap2.z as vktperc, sum(vktperc) as vktcumsum
from roaddata rd1
inner join roaddata rd2 on rd1.road_id >= rd2.road_id
cross apply (select count*kilometers as product) cap1(y)
cross apply (select (vkt/sum(vkt))*100 as percentage) cap2(z)
group by road_id, count
order by count desc;

【问题讨论】:

  • 编辑您的问题并显示您想要的结果。例如,你想要什么累积总和?你要的百分比是多少?还要标记您正在使用的数据库..

标签: sql cumulative-sum


【解决方案1】:

如果我理解正确,你想要这样的东西:

select rd.*,
       centimeters / 100000 as kilometers, 
       count * centimeters / 100000 as vkt,
       ( sum(count * centimeters / 100000) over (order by count) /
         sum(count * centimeters / 100000) over ()
       ) as vktcumsum      
from roaddata rd;

但是如果没有结果和清晰的解释(不是代码!),很难知道这是否真的是你想要做的。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2021-08-19
    • 2022-01-13
    相关资源
    最近更新 更多