[英]Row blocks in Hive (how to group rows by certain criteria and count these groups)
[英]In SQL, how do you count if any rows in a group match a certain criteria?
我是 SQL 的新手,但我有一個包含學生、他們的 class 科目以及他們的工作是否有錯誤的數據集。 我想知道有多少學生在任何科目中至少有 1 個錯誤。 因此,無論學生的一門科目有錯誤(如示例中的學生 2 和 3)還是有多個錯誤(如學生 4),他們都會被標記。 只有當它們沒有錯誤時,才應將它們歸類為“否”。
我知道我必須使用 GROUP BY 和 COUNT,我想我也必須使用 HAVING,但我似乎無法將它們放在一起。 這是一個示例數據集:
ID Rating Error
==========================================
1 English No
1 Math No
2 English Yes
2 Math No
2 Science No
3 English Yes
4 English Yes
4 Math Yes
以及所需的 output:
Error Count Percent
==========================================
No 1 .25
Yes 3 .75
有很多不同的方法可以做到這一點,這里是一個使用 CTE(公用表表達式)的例子:
with t as (
select
id,
case when sum(case when error='Yes' then 1 else 0 end) > 0 then 'Yes' else 'No' end as error
from students
group by id
)
select
error,
count(*),
(0.0 + count(*)) / (select count(*) from t) as perc
from t
group by error
基本上,內部查詢( t
)用於計算每個學生的錯誤狀態,外部查詢計算錯誤分布/百分比數
您可以使用幾個有用的功能:
bool_or(boolean) → boolean
- 如果任何輸入值為TRUE
TRUE
否則返回 FALSE。if(condition, true_value, false_value)
- 如果條件為真,則評估並返回true_value
,否則評估並返回false_value
。
select count(distinct id)
- 計算不同的 id。
with dataset (ID,Rating,Error) as (
values (1,'Math','No'),
(2,'English','Yes'),
(1,'English','No'),
(2,'Math','No'),
(2,'Science','No'),
(3,'English','Yes'),
(4,'English','Yes'),
(4,'Math','Yes')
)
select if(has_error, 'Yes', 'No') Error,
count(*) Count,
cast(count(*) as double) / (select count(distinct id) from dataset) Percent
from (
select bool_or(Error = 'Yes') has_error
from dataset
group by id
)
group by has_error;
Output:
錯誤 | 數數 | 百分 |
---|---|---|
是的 | 3 | 0.75 |
不 | 1 | 0.25 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.