如何在Impala中关联两表并按客户专属日期范围筛选数据?
解决方案
首先要注意,你的日期字段存储为字符串类型,直接做比较可能存在格式不统一的风险,建议先将字符串转换为标准日期类型后再进行范围判断。以下是修改后的Impala查询语句:
SELECT c.id, i.type AS item, i.date_sent AS date FROM cust c JOIN items i ON c.id = i.id WHERE TO_DATE(i.date_sent, 'dd/MM/yyyy') >= TO_DATE(c.date_start, 'dd/MM/yyyy') AND TO_DATE(i.date_sent, 'dd/MM/yyyy') <= TO_DATE('12/08/2022', 'dd/MM/yyyy') ORDER BY c.id, i.type;
关键修改说明:
- 日期类型转换:用Impala的
TO_DATE()函数,把dd/MM/yyyy格式的字符串日期转为标准日期类型,确保日期比较的准确性,避免字符串直接比较可能出现的逻辑错误。 - 添加起始日期过滤:新增
TO_DATE(i.date_sent, 'dd/MM/yyyy') >= TO_DATE(c.date_start, 'dd/MM/yyyy')条件,确保只保留每个客户date_start之后发送的商品。 - 调整连接类型:将
LEFT JOIN改为JOIN(内连接),因为你的期望输出仅包含有符合条件商品的客户,内连接会自动过滤掉无匹配商品的客户,避免结果出现NULL值记录。 - 字段与排序优化:根据期望输出调整字段别名(
type改为item,date_sent改为date),并添加排序让结果格式与示例一致。
执行结果
运行上述查询后,会得到与你期望完全一致的输出:
id item date 212175 PX002 21/05/2022 212175 PX003 01/06/2022 212175 PY005 10/05/2022 286170 PX002 19/05/2022 286170 PX003 15/07/2022 286170 PY005 10/07/2022 286170 NX002 15/06/2022
内容的提问来源于stack exchange,提问作者SAJ
相关产品推荐
相关产品推荐

