Hive自我加入基于以前的日期

时间:2014-11-17 23:23:57

标签: sql join hive

我有一个表有三列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永远不会为空。

你们知道我的第二个查询是否有效吗?如果没有,请你建议一个替代方案。

由于

2 个答案:

答案 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');