Pergunta SQL: Obtendo registros com base em datediff de registro para registro

StackOverflow https://stackoverflow.com/questions/1134272

  •  16-09-2019
  •  | 
  •  

Pergunta

Ok, tenho um assunto delicado aqui ... Se meus olhares de dados como este:

Tabela 1

ID  Date_Created 
1   1/1/2009
2   1/3/2009
3   1/5/2009
4   1/10/2009
5   1/15/2009
6   1/16/2009

Como faço para obter os registros que são 2 dias afastados uns dos outros? Meu fim conjunto de resultados deve ser linhas 1-3 e 5-6. Obrigado!

Foi útil?

Solução

select distinct t1.*
from Table1 t1
inner join Table1 t2 
    on abs(cast(t1.Date_Created - t2.Date_Created as float)) between 1 and 2

Outras dicas

SELECT l.*
FROM Table1 l
INNER JOIN Table1 r ON DATEDIFF(d, l.Date_Created, r.Date_Created) = 2
      AND r.Date_Created = (SELECT TOP 1 * FROM Table1 WHERE Date_Created > l.Date_Created ORDER BY Date_Create)

- o que faz isso dar-lhe

selecione t1.id DISTINCT, t1.date_created, t2.id, t2.date_created de t1 table1, t2 table1 onde datediff (dd, t1.date_created, t2.date_created) = 2 e t1.id! = T2.id ORDER BY t1.id;

Será que este trabalho?

select t1.id, t2.id 
  from table1 t1 
  join table1 t2 
    on t2.date_created - t1.date_created <= 2

Eu poderia sugerir o uso de código de programação para fazê-lo. Pretende recolher grupos de linhas (grupos separados). Eu não acho que você pode resolver isso usando uma única consulta (que iria dar-lhe apenas um conjunto de linhas de volta).

Se você quiser obter as linhas que estão dentro de dias 'N' de distância, você pode tentar este:

select t1.date_created, t2.date_created 
from table1 t1, table1 t2 
where t1.id <> t2.id and 
      t2.date_created-t1.date_created between 0 and N;

para exmaple, como você disse, se você quiser obter as linhas que estão dentro de 2 dias uma parte, você pode usar o abaixo:

select t1.date_created,t2.date_created 
from table1 t1, table1.t2 
where t1.id <> t2.id and 
      t2.date_created-t1.date_created between 0 and 2;

Espero que isso ajude ....

Saudações, Srikrishna.

Um cursor será mais rápido, mas aqui é uma consulta SELECT que irá fazê-lo. Note-se que para "até N" dias de intervalo em vez de 2, você terá que substituir a mesa Dois com uma tabela de números inteiros de 0 a N-1 (ea eficiência vai piorar).

Eu vou admitir que não é totalmente claro o que você quer, mas eu sou acho que você quer os intervalos de linhas que contêm pelo menos duas linhas em todos e em que as linhas sucessivas são, no máximo, 2 dias de intervalo. Se as datas aumentar juntamente com IDs, isso deve funcionar.

with Two as (
  select 0 as offset union all select 1 
), r2(ID, Date_Created_o, dr) as (
  select
    ID, Date_Created+offset,
    Date_Created + offset - dense_rank() over (
      order by Date_Created+offset
    ) from r cross join Two
)
  select
    min(ID) as start, max(ID) as finish
  from r2
  group by dr
  having min(ID) < max(ID)
  order by dr;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top