where 1 <> 1 不能过滤掉数据的问题||非真条件不能过滤数据的问题

文章讲述了在使用Hive和MySQL查询中,通过`last_day`函数过滤月底数据时,遇到的空数据插入问题。作者通过示例展示了问题现象,并提出在外层查询中再次应用`last_day`条件来解决。问题可能源于数据库底层逻辑,期待技术专家的深入分析。
摘要由CSDN通过智能技术生成

记录一个有意思的事情,where 1 <> 1 不能过滤掉数据的问题
问题出现的背景
有一个报表,每天执行,但只想在月末那一天载入数据,于是使用条件
where day_id = last_day(day_id)
但是在使用聚合函数的时候,会载入一条空数据。

问题出现在hive中,测试发现mysql也存在这样子的问题,下面以mysql为例测试:

-- 测试数据代码:mysql为例
drop table if exists db333.tmp_test_123;
create table if not exists db333.tmp_test_123
(
day_id date comment '数据日期'
,city_name   varchar(30)  comment '地市'
,balance     decimal(18,2)   comment '余额'
);

-- 模拟月底数据载入
insert into db333.tmp_test_123
(
day_id
,city_name
,balance
)
select * from (
select '2024-04-30' as day_id, '济南' as city_name, 1000 as balance union all
select '2024-04-30' as day_id, '青岛' as city_name, 2000 as balance union all
select '2024-04-30' as day_id, '淄博' as city_name, 3000 as balance union all
select '2024-04-30' as day_id, '烟台' as city_name, 4000 as balance union all
select '2024-04-30' as day_id, '潍坊' as city_name, 5000 as balance 
) t
where day_id = last_day(day_id) -- 月底
;
commit;

-- 载入合计值
insert into db333.tmp_test_123
(
day_id
,city_name
,balance
)
select '2024-04-30', '合计' as city_name, sum(balance) as balance

from db333.tmp_test_123
where day_id = last_day(day_id) -- 月底
and day_id = '2024-04-30'
;

1. 月底当天跑批的时候(2024-04-30),数据是没有问题的(下图1);

2. 但是非月底的时候(将代码中的日期替换为2024-05-01),基础数据不会载入,但是合计数据会载入一条空数据。(下图2)

问题解决: 解决此问题,可以考虑在以上查询的外层再套一层查询,将月底的判断条件写在外层就能达到过滤数据的目的。
insert into db333.tmp_test_123
(
day_id
,city_name
,balance
)
select day_id, city_name, balance
from
(
	select '2024-04-21' as day_id, '合计' as city_name, sum(balance) as balance
	from db333.tmp_test_123
	where day_id = last_day(day_id) -- 月底
	and day_id = '2024-04-21'
)t1
where day_id = last_day(day_id) -- 月底

问题原因分析:

这里应该是涉及到了数据库底层的逻辑,由于技术水平有限,仅做问题记录,不做分析,欢迎懂行的大佬评论分析。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值