背景:有一个数据集由汇总记录和明细记录关联查询,因为是一对多的关系,所以汇总数据在数据集中重复了,需要取出不重复的,即取出最后一天的其中的一条数据(最后一天也有多条)。
环境:MySQL 5.7
测试数据如下:
其中aa、bb是分组统计条件,cc列是统计值,dt列是日期,r_id是明细记录ID
drop table if exists testtb;
create table testtb(aa varchar(20), bb varchar(20), cc int, dt date, r_id int);
insert into testtb(aa, bb, cc, dt, r_id)
values
('A', '甲', 20, '2021-09-24', 1014),
('A', '甲', 20, '2021-09-24', 1013),
('A', '甲', 20, '2021-09-24', 1012),
('A', '甲', 18, '2021-09-23', 1011),
('A', '甲', 19, '2021-09-22', 1010),
('A', '乙', 10, '2021-09-24', 1009),
('A', '乙', 11, '2021-09-23', 1008),
('A', '乙', 12, '2021-09-22', 1007),
('B', '甲', 30, '2021-09-24', 1006),
('B', '甲', 31, '2021-09-23', 1005),
('B', '甲', 28, '2021-09-22', 1004),
('B', '乙', 40, '2021-09-24', 1003),
('B', '乙', 36, '2021-09-23', 1002),
('B', '乙', 35, '2021-09-22', 1001);
期望结果:
进行如下这种结构查询时,即where条件在外层,不在派生表tb中,不论where条件怎么变,始终取出最后一天的cc列值并去重。
比如时间23到24号,对于"A"+"甲",要取出r_id = 1014的cc列。
比如时间22到23号,对于"A"+"甲",要取出r_id = 1011的cc列。
select *
from (select * from testtb) tb
where dt between '2021-09-22' and '2021-09-23';
mysql> select *
-> from testtb t
-> where dt between '2021-09-23' and '2021-09-24'
-> and not exists (
-> select 1 from testtb
-> where dt between '2021-09-23' and '2021-09-24'
-> and aa=t.aa and bb=t.bb
-> and r_id>t.r_id);
+------+------+------+------------+------+
| aa | bb | cc | dt | r_id |
+------+------+------+------------+------+
| A | 甲 | 20 | 2021-09-24 | 1014 |
| A | 乙 | 10 | 2021-09-24 | 1009 |
| B | 甲 | 30 | 2021-09-24 | 1006 |
| B | 乙 | 40 | 2021-09-24 | 1003 |
+------+------+------+------------+------+
4 rows in set (0.00 sec)