SQL-запрос - выберите дубликаты в течение 12 часов - PullRequest
2 голосов
/ 08 января 2009

если у меня есть данные следующим образом

А | 01.01.2008 00: 00: 00

B | 01.01.2008 01: 00: 00

А | 01.01.2008 11: 59: 00

С | 01.02.2008 00: 00: 00

D | 01.02.2008 01: 00: 00

D | 01.02.2008 20: 00: 00

Я хочу выбрать только те записи, чьи идентификаторы (A, B, C или D) встречались дважды в течение 12 часов. В этом примере выше это будет только 'A'

Может кто-нибудь помочь, пожалуйста (это для базы данных Oracle)

Спасибо

M

Ответы [ 6 ]

6 голосов
/ 08 января 2009
 Select Distinct A.Identifer  
  From Table A
    Join Table B --  EDIT to eliminate self Joins (to same row)
        On A.PrimKey <> B.PrimaryKey
           And A.Identifer = B.Identifer               
           -- EDIT to fix case where 2 at same time
           And A.OccurTime >=  B.OccurTime 
           And A.OccurTime < B.OccurTime + .5

и реализовать вопрос, заданный в комментарии, (Игнорирование записей в разные дни)

- для SQL Server,

   Select Distinct A.Identifer  
    From Table A
      Join Table B 
        On A.PrimKey <> B.PrimaryKey
           And A.Identifer = B.Identifer
           -- EDIT to fix case where 2 at same time
           And A.OccurTime >= B.OccurTime  
           And A.OccurTime < B.OccurTime + .5
    Where DateDiff(day, A.OccurTime, B.OccurTime) = 0

- или для оракула ...

 Select Distinct A.Identifer  
    From Table A
      Join Table B 
        On A.PrimKey <> B.PrimaryKey
           And A.Identifer = B.Identifer
           -- EDIT to fix case where 2 at same time
           And A.OccurTime >= B.OccurTime  
           And A.OccurTime < B.OccurTime + .5
 Where Trunc(A.OccurTime) = Trunc(B.OccurTime)
2 голосов
/ 08 января 2009

Я не проверял запрос Уильяма, но я бы серьезно подумал об использовании того, что у него есть, по сравнению с другими. Аналитика - это бомба. Каждый раз, когда вы обнаруживаете, что присоединяете таблицу обратно к себе, практически гарантируется возможность использовать аналитику, и она будет выполнять запрос с одной таблицей, на которую ссылаются дважды каждый раз.

Вы будете поражены насколько быстрее будет аналитическое решение.

2 голосов
/ 08 января 2009
Select    
  A.Id
From    
  YourTable A 
Where    
  A.YourDateTime Between :StartDateTime and :EndDateTime 
Group By    
  A.Id
Having    
  COUNT(A.Id) = 2
1 голос
/ 08 января 2009

Я не на 100% уверен в ваших требованиях, однако это может дать вам некоторые идеи о том, как делать то, что вам нужно. Например, вы сказали ровно 2; Что делать, если есть 3 случая? и т.д.

create table t (ident varchar2(16), occurance timestamp);

insert into t (ident, occurance) values ('a', to_date('20080101000000', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('b', to_date('20080101010000', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('a', to_date('20080101115900', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('c', to_date('20080102000000', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('d', to_date('20080102010000', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('d', to_date('20080102200000', 'yyyymmddhh24miss'));

insert into t (ident, occurance) values ('d', to_date('20080103020000', 'yyyymmddhh24miss'));

select ident, occurance
from
(
select ident, occurance,
    lag(occurance) over (partition by ident order by occurance) previous, 
    lead(occurance) over (partition by ident order by occurance) next 
from t
)
where 
    ((occurance-previous<interval'12:00' hour to minute and extract(day from occurance) = extract(day from previous))
    or (next-occurance<interval'12:00' hour to minute and extract(day from occurance) = extract(day from next)))
/
1 голос
/ 08 января 2009
SELECT identifier
  FROM table_name outer
 WHERE EXISTS( SELECT 1
                 FROM table_name inner
                WHERE inner.identifier  = outer.identifier
                  AND inner.date_column BETWEEN outer.date_column AND outer.date_column + interval '12' hour
                  AND inner.rowid != outer.rowid )
0 голосов
/ 08 января 2009
SELECT namecol FROM tbl A
WHERE EXISTS (
  SELECT 1 from tbl B
  WHERE b.namecol = a.namecol
  AND b.timestamp > a.timestamp
  AND b.timestamp - 0.5 <= a.timestamp )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...