我有一个表有三列id,名称和日期。每天我都会从外部进程转储所有名称和ID。我想生成一个输出表,每天我都会计算当天发生的我没见过的唯一姓名数。
例如,给出以下数据
id name d
1 Bob 2014-01-01
2 Suzy 2014-01-01
3 Jen 2014-01-02
4 Jen 2014-01-02
5 Bob 2014-01-02
6 Jon 2014-01-03
7 Mike 2014-01-03
8 Suzy 2014-01-03
我想要一个返回的查询
d name_count
2014-01-02 1
2014-01-03 2
我的第一个想法是使用如下所示的相关子查询,但Hive不支持
select c.d, count(distinct lower(c.name)) as name_count
from db c
where lower(c.name) not in (
select lower(p.name) as name
from db p
where p.d < c.d
group by lower(p.company_name)
)
group by d
我也想使用左外连接,但我不认为这会给我我想要的东西
select c.d, count(distinct lower(c.name)) as name
from db c
left outer join db p on lower(c.name) = lower(p.name)
where p.name is null and p.d < c.d
group by c.d;
因为我自己加入时,p.name永远不会为空。
你们知道我的第二个查询是否有效吗?如果没有,请你建议一个替代方案。
由于
答案 0 :(得分:2)
稍微不同的方法,但嵌套查询应解决此问题:
查询:
选择q.d,COUNT(*)from(select name,min(d)as table from table_name GROUP BY名称)q GROUP BY q.d
输出:
2014-01-01 2
2014-01-02 1
2014-01-03 2
答案 1 :(得分:0)
第二个查询无法正常工作,日期比较应在加入中,如下所示:
select c.date, count(distinct c.name) as count_name
from db c
left join db p
on lower(c.name) = lower(p.name)
and p.date < c.date
where p.name is null
group by c.date
您可以使用以下架构在http://sqlfiddle.com/上对其进行测试:
CREATE TABLE db
(
id int,
name varchar(255),
date varchar(20)
);
insert into db values(1,'Bob', '2014-01-01');
insert into db values(2,'Suzy', '2014-01-01');
insert into db values(3,'Jen', '2014-01-02');
insert into db values(4,'Jen', '2014-01-02');
insert into db values(5,'Bob', '2014-01-02');
insert into db values(6,'Jon', '2014-01-03');
insert into db values(7,'Mike', '2014-01-03');
insert into db values(8,'Suzy', '2014-01-03');