0

鉴于以下情况:

drop table if exists a;

create table a (
    id CHAR(30),
    d1 DATETIME,
    d2 DATETIME
);

insert into a values (1, '2012/1/1', '2012/1/2');
insert into a values (1, '2012/1/15', '2012/1/16');
insert into a values (1, '2012/1/25', '2012/1/26');
insert into a values (1, '2012/2/10', '2012/2/11');

insert into a values (2, '2012/1/1', '2012/1/2');
insert into a values (2, '2012/2/6', '2012/2/7');

我想返回每个 ID 的所有记录,但在 30 天内消除任何重复项(datediff(d2,d1) <= 30):

+------+---------------------+---------------------+
| id   | d1                  | d2                  |
+------+---------------------+---------------------+
| 1    | 2012-01-01 00:00:00 | 2012-01-02 00:00:00 |
| 1    | 2012-02-10 00:00:00 | 2012-02-11 00:00:00 |
| 2    | 2012-01-01 00:00:00 | 2012-01-02 00:00:00 |
| 2    | 2012-02-06 00:00:00 | 2012-02-07 00:00:00 |
+------+---------------------+---------------------+

由于 1/15 和 1/25 在 1/1 的 30 天内,因此将它们删除。希望这是有道理的。在一次选择中。

4

1 回答 1

0

此查询选择在它们之前 30 天或更短的时间内没有具有相同 id 的行的所有行:

select * from table a a1
where not exists (select 1 from table a a2 where a2.id = a1.id
and (days(a1.d1) - days(a2.d1) < 30) and (days(a1.d1) > days(a2.d1))

子查询的两个部分是:查找在我们之前但不超过 30 天的行,如果我们发现拒绝这一行。

根据需要替换您自己的 sql 风格的日期函数/日期差异函数

于 2013-04-12T00:28:20.353 回答