等待戈多12 2021-09-24 16:53 采纳率: 0%
浏览 8

取查询区间内最后一天的数据并去重

背景:有一个数据集由汇总记录和明细记录关联查询,因为是一对多的关系,所以汇总数据在数据集中重复了,需要取出不重复的,即取出最后一天的其中的一条数据(最后一天也有多条)。

环境: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';
  • 写回答

1条回答 默认 最新

  • ACMAIN_CHM 2021-09-25 16:28
    关注
    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)
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月24日