查询另一个表中列出的日期

Posted

技术标签:

【中文标题】查询另一个表中列出的日期【英文标题】:Querying for dates listed in another table 【发布时间】:2015-07-22 17:53:06 【问题描述】:

我想选择两个日期之间的表格中的某些行(在单独的表格中找到)。我的表和查询的详细信息可以在之前的问题here 中找到(我现在对如何在 HIVE/hiveQL 中执行此操作感兴趣)。正如我当前的查询所代表的那样,它运行了很长时间,然后似乎无限期地挂起,而当我在日期中硬编码时,它运行完成的速度相当快。表和查询供参考:

VISIT_INFO,包含这些列:

pers_key - unique identifyer for each person
pers_name - name of person
visit_date - date at which they visited a business

VALID_DATES,包含这些列:

condition - string
start_date - date
end_date - date 

还有查询本身:

select pers_key, pers_name from VISIT_INFO a
CROSS JOIN
(select start_date, end_date from VALID_DATES where condition = 'condition1') b
WHERE (a.visit_date >= b.start_date and a.visit_date <= b.end_date)
GROUP BY a.pers_key

值得注意的是,我使用的是 HIVE 0.12,因此摆脱连接并将 select 语句放在 WHERE 子句中是不可能的。我想知道这个查询到底有什么问题,或者是什么导致它失败。任何有关如何改进这一点的建议将不胜感激。

【问题讨论】:

刚刚添加的信息。 【参考方案1】:

试试:

select pers_key, pers_name 
from VISIT_INFO a 
join 
valid_dates b
WHERE a.visit_date BETWEEN b.start_date AND b.end_date
GROUP BY pers_key, pers_name;

从 Hive 0.13 开始:

select pers_key, pers_name 
from VISIT_INFO a , valid_dates b
WHERE a.visit_date BETWEEN b.start_date AND b.end_date
GROUP BY pers_key, pers_name;

【讨论】:

valid_dates 中的每个 start_date 和 end_date 都对应一个特定的条件。我需要检查 visit_date 是否在“condition1”的 start_date 和 end_date 之间。我可以将它添加到 where 子句中吗? 如果在查询中返回特定段需要条件,则可以将其添加到 where 子句。如果您的条件类似于网络、信息亭、柜台或电话等客户渠道,您可以添加到 where 子句进行过滤。 “在 ('web','kiosk') 中的条件”。 @invokertheshell 太棒了,这工作,谢谢。知道为什么我的原始查询需要几个小时而这不到 20 分钟吗?我应该提到 VISIT_INFO 是一个非常大的表。 我的查询是内部联接,而您的查询是完全外部联接(笛卡尔联接)。另外,您能否为我的答案投票并选择作为答案。

以上是关于查询另一个表中列出的日期的主要内容,如果未能解决你的问题,请参考以下文章

基于同一表上的另一个查询过滤记录的 SQL

Access 数据库需要从另一个表中获取最近日期的记录

SQL的一些查询语句

检查一个表中的日期是不是出现在 Access 中另一个表的范围内

Oracle Query 按另一个表中的每个日期范围对一列求和

选择具有最近日期的唯一值,按另一个值分组