我有一个带有schema的表。我想要一个输出表,其中包含每个帐户的所有交易(T)的计数,以及超过特定日期(例如今天30)的那些交易(每个帐户)的计数。
分组列是通用的,即“帐户”,但计数策略不同。使用两个不同的查询并连接结果很容易做到这一点,但是有可能在单个sql查询中做到这一点吗?
输入:
Account | T_id | T_date
---------|-------|---------
A1 | t1 | 205
A1 | t2 | 420
A1 | t3 | 180
A1 | t5 | 290
A2 | t6 | 100
预期产量(c = 200):
Account | T_count | T_count_greater_than_c
---------|----------|-------------------------
A1 | 3 | 2
A2 | 2 | 1
要实现计数,我们可以做到
SELECT Account, COUNT(T_id)
FROM T
GROUP BY Account
要实现count>c
,我们可以
SELECT Account, COUNT(T_id)
FROM T
GROUP BY Account
HAVING T_date > c
如何在单个查询中合并这两个内容并阻止联接操作?
答案 0 :(得分:3)
在sum()中使用case或IF语句应用条件聚合:
with mydata as(--Replace this with your table
select stack(6,
1, '2019-08-01', 100,
1, '2019-08-01', 100,
1, '2019-07-01', 200,
2, '2019-08-01', 100,
2, '2019-08-01', 100,
2, '2019-07-01', 200
) as (account, transaction_date, amount)
)
select account, sum(amount) amount,
sum(case when transaction_date < date_sub(current_date,30) then amount else 0 end) amount_beyond_30
from mydata
group by account;
结果:
account amount amount_beyond_30
1 400 200
2 400 200
Time taken: 40.716 seconds, Fetched: 2 row(s)
对不起,我的示例是针对Hive SQL的,数据库中的某些功能可能有所不同,但是希望您现在就知道如何在SQL中进行条件聚合。
添加示例和SQ后,更新 L:
SELECT Account, COUNT(T_id) as cnt,
count(case when T_date > 200 then 1 else null end) as T_count_greater_than_c
FROM T
GROUP BY Account