表产品
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不支持不相关的子选择
需要别人的帮助!
答案 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()计算所有内容,因此得到总计数