Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
Sql 如何使用与count distinct语句相关的百分比创建附加列_Sql_Hive_Apache Spark Sql - Fatal编程技术网

Sql 如何使用与count distinct语句相关的百分比创建附加列

Sql 如何使用与count distinct语句相关的百分比创建附加列,sql,hive,apache-spark-sql,Sql,Hive,Apache Spark Sql,我试图在一个表中查询每个不同的医学专业(如肿瘤学家、儿科医生等),然后计算索赔(claim\u id)链接到它的次数,我使用以下方法完成了此操作: select distinct specialization, count(distinct claim_id) AS Claim_Totals from table1 group by specialization order by Claim_Totals DESC 但是,我还想增加一列,列出每个专业在表中所占的百分比(基于与之相关的claim

我试图在一个表中查询每个不同的医学专业(如肿瘤学家、儿科医生等),然后计算索赔(
claim\u id
)链接到它的次数,我使用以下方法完成了此操作:

select distinct specialization, count(distinct claim_id) AS Claim_Totals
from table1
group by specialization
order by Claim_Totals DESC
但是,我还想增加一列,列出每个专业在表中所占的百分比(基于与之相关的
claim\u id
)。例如,如果总共有100项索赔,“心脏病专家”有25项与之相关的索赔记录,“肿瘤专家”有15项,“普通外科医生”有10项,依此类推,我希望输出结果如下:

specialization | Claims_Totals | PERCENTAGE
___________________________________________
cardiologist       25               25%
oncologist         15               15%
general surgeon    10               10%
你可以用

,concat_ws('',count(不同的索赔id),'%')作为百分比

,concat(计数(不同的索赔id),“%”作为百分比

添加到选择列表的尾部


顺便说一句,在选择列表中进行专门化之前,
distinct
是多余的,因为已经包含在group by列表中。

可以这样做吗?我不熟悉Barbaros的语法。如果这行得通的话,它会更简洁更好

select specialization, count(distinct claim_id) AS Claim_Totals, count(distinct claim_id)/total_claims
from table1 
INNER JOIN ( SELECT COUNT(DISTINCT claim_id)*1.0000 total_claims AS total_claims 
               FROM table1 ) TMP
   ON 1 = 1
group by specialization
order by Claim_Totals DESC


select specialization, 
       count(distinct claim_id) AS claim_by_spec,
       count(distinct claim_id)/
       ( SELECT COUNT(DISTINCT claim_id)*1.0000
               FROM table1 ) AS percentage_calc
from table1 
group by specialization
order by Claim_Totals DESC
您可以使用
sum(count(distinct))over()
来获得总体索赔,并在分母中使用它来获得百分比

select specialization
      ,count(distinct claim_id) AS Claim_Totals
      ,round(100*count(distinct claim_id)/sum(count(distinct claim_id)) over(),3) as percentage
from table1
group by specialization

因为您使用的是
count(distinct)
,所以窗口函数不太有用。您可以尝试:

select t1.specialization,
       count(distinct t1.claim_id) AS Claim_Totals,
       count(distinct t1.claim_id) / tt1.num_claims
from table1 t1 cross join
     (select count(distinct claim_id) as num_claims
      from table1
     ) tt1
group by t1.specialization
order by Claim_Totals DESC

我试着运行这两个,但他们只是给了我索赔总额栏作为一个百分比。我想使新列中的百分比与索赔总额成比例。很抱歉,我的原始评论中没有特别清楚。@David您是否将选择列表添加为
select specialization,count(distinct claim_id)作为claim_Totals,concat(count(distinct claim_id),“%”作为百分比
select specialization,count(distinct claim_id)作为claim_Totals,concat(count(distinct claim_id),“%”)作为表1中的百分比,选择列表中的“按专业化分组顺序按索赔”总计DESC
distinct
之前的
专业化
是多余的,因为已包含在“按列表分组”中我在尝试运行时不断收到解析错误this@David我猜蜂巢没有“交叉连接”。添加了一些备选方案。感谢编辑,我认为这是可行的,但我得到的
百分比\u calc
格式非常不理想(例如6.434891e-8、0.000012443087等)。这个数据库相当大,所以有没有办法让它看起来像样?再次感谢你确定你是在乘以1.0000而不是10000?我只是在讨论hive不可能是整数。谢谢你的发布,我相信这是正确的,但是
百分比
列的格式非常混乱。是否有方法将其清理为仅包含10.115%(或四舍五入到最接近的千分之一)之类的内容?使用函数
round
对结果进行处理,并在小数点后添加所需的位数。您能告诉我如何将其构建到您的特定查询中吗?我不熟悉圆函数