Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到占每家店铺收入70%的顶级客户数量(hive/sql/python)_Python_Sql_Hive - Fatal编程技术网

如何找到占每家店铺收入70%的顶级客户数量(hive/sql/python)

如何找到占每家店铺收入70%的顶级客户数量(hive/sql/python),python,sql,hive,Python,Sql,Hive,我试图找出每家商店70%收入的客户数量 店号 顾客 %收入分担 1. A. 0.1 1. B 0.5 1. B 0.4 2. A. 0.2 2. B 0.5 2. C 0.3 这可以通过使用CTE实现。在Mysql v8中提供 SQL: 说明: 在cte1中,根据客户对收入的总perc贡献对客户进行排名。 在cte2中,首先选择带有rnk 1的记录。然后,如果累计百分比

我试图找出每家商店70%收入的客户数量

店号 顾客 %收入分担 1. A. 0.1 1. B 0.5 1. B 0.4 2. A. 0.2 2. B 0.5 2. C 0.3
这可以通过使用CTE实现。在Mysql v8中提供

SQL:

说明:

在cte1中,根据客户对收入的总perc贡献对客户进行排名。 在cte2中,首先选择带有rnk 1的记录。然后,如果累计百分比<0.7,则递归选择车间的下一个rnk记录。
DB Fiddle Link:

聚合数据并对收入进行累计。这看起来像:

select shop_no, customer,
       sum(contribution) as contribution,
       sum(sum(contribution)) over (partition by shop_no order by sum(contribution) desc) as running_contribution
from t
group by shop_no, customer;
接下来,您需要超过70%的客户数量。一种方法是:

select shop_no, count(*) as num_customers
from (select shop_no, customer,
             sum(contribution) as contribution,
             sum(sum(contribution)) over (partition by shop_no order by sum(contribution) desc) as running_contribution
      from t
      group by shop_no, customer
     ) sc
where running_contribution - contribution < 0.7
group by shop_no;

WHERE子句正在检查前一个值是否小于0.7-这意味着它将获得通过阈值的第一行。

请参阅并注意,此问题属于np完全问题。@草莓有没有办法使其变得简单?我只需要对每家店铺70%的收入贡献的客户进行最终统计。这个解决方案也适用于hive吗?@alisha,我不这么认为。看起来配置单元不支持递归CTE。Gordon的答案很简洁,应该更适合您的需要。因此,我的表很大,代码的累积和部分卡住了。。有没有更优化的方法来实现这一点?我试着把它分成两个步骤,在一个步骤中聚合数据,这个步骤已经完成了。但是第二步中的运行贡献又被卡住了。@alisha。这将是最有效的方法。一个问题可能是,如果您有一些商店由于数据中的异常而拥有数不清的行。
select shop_no, count(*) as num_customers
from (select shop_no, customer,
             sum(contribution) as contribution,
             sum(sum(contribution)) over (partition by shop_no order by sum(contribution) desc) as running_contribution
      from t
      group by shop_no, customer
     ) sc
where running_contribution - contribution < 0.7
group by shop_no;