如何查询vertica中聚合的百分比

时间:2016-02-12 23:45:47

标签: sql database vertica

表产品

productId type
1          A
2          A
3          A
4          B
5          B
6          C

我想要的是什么:

type     perc
A         0.5
B         0.33
C         0.17

我们可以写一个简单的查询:

Select type, cnt/(select count(*) from product) AS perc
FROM (
select type, count(*) as cnt
from product
group by type
 ) nested

但是vertica不支持不相关的子选择

需要别人的帮助!

2 个答案:

答案 0 :(得分:1)

即使您可能对加入谓词有限制,Vertica 也支持相关和非相关子查询

所以,你上面的查询是有效的。并且 - 猜猜是什么 - 即使你使用缩进它也会继续工作:

SQL> SELECT
         type
       , cnt/( select count (*) FROM product ) AS perc
     FROM
         ( SELECT type, count (*) as cnt
           FROM product
           GROUP BY type
         ) nested ;
 type |         perc         
------+----------------------
 C    | 0.166666666666666667
 A    | 0.500000000000000000
 B    | 0.333333333333333333
(3 rows)

当然你可以用不同的方式重写它。例如:

SQL> SELECT
        a.type
      , a.cnt/b.tot as perc
    FROM
      ( SELECT type , count (*) as cnt
        FROM product
        GROUP BY type ) a
    CROSS JOIN
      ( SELECT count (*) AS tot
        FROM product ) b
    ORDER BY 1
    ;
 type |         perc         
------+----------------------
 A    | 0.500000000000000000
 B    | 0.333333333333333333
 C    | 0.166666666666666667
(3 rows)

答案 1 :(得分:1)

你也可以使用分析函数,这个函数在这个应用程序中很麻烦,但是工作:

before(:each) do
  @user_valid = FactoryGirl.create(:user)
end

it "validates for password when updating_password is true" do
  old_password = @user_valid.password
  subject { @user_valid }
  allow(subject).to receive(:updating_password).and_return(true)
  @user_valid.update(password: "short", password_confirmation: "short")
  expect(@user_valid.password).to eql(old_password)
end

count(*)over(按类型分区)计算每种类型;

count(*)over()计算所有内容,因此得到总计数