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))

サブクエリの 2 つの部分は次のとおりです。私たちより前にあるが 30 日以内の行を探します。見つかった場合は、この行を拒否します。

必要に応じて、独自の SQL フレーバーの日付関数/日付差分関数に置き換えます

于 2013-04-12T00:28:20.353 に答える