interrogación SQL: Obtener registros basados ​​en datediff de un registro a

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

  •  16-09-2019
  •  | 
  •  

Pregunta

Ok, tengo un asunto difícil aquí ... Si mis datos es el siguiente:

Tabla1

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

¿Cómo puedo obtener los registros que son 2 días de diferencia el uno del otro? Mi conjunto resultado final debe ser filas 1-3 y 5-6. Gracias!

¿Fue útil?

Solución

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

Otros consejos

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)

-? ¿Qué tiene esto que dan

seleccione t1.id DISTINCT, t1.date_created, t2.id, t2.date_created de t1 tabla1, t2 tabla1 donde datediff (dd, t1.date_created, t2.date_created) = 2 Y t1.id! = T2.id ORDER BY t1.id;

Que este trabajo?

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

Yo podría sugerir el uso de código de programación para hacerlo. Se quiere recoger grupos de filas (grupos separados). Creo que no se puede resolver esto utilizando una única consulta (que le daría un solo conjunto de filas más atrás).

Si desea obtener las filas que están dentro de 'N' días de diferencia, puede intentar lo siguiente:

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;

de ejemplo, los grupos como usted ha dicho, si desea obtener las filas que están dentro de 2 días a la parte, puede utilizar el siguiente:

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 esto ayude ....

Saludos, Srikrishna.

Un cursor será más rápido, pero aquí hay una consulta SELECT que lo hará. Tenga en cuenta que para "N" hasta días de diferencia en lugar de 2 tendrá que reemplazar la tabla Dos con una tabla de números enteros de 0 a N-1 (y la eficiencia obtendrá peor).

Voy a admitir que no es del todo claro lo que quiere, pero estoy supongo que se desea que los rangos de filas que contienen al menos dos filas en todos y en el que las filas sucesivas se encuentran en la mayoría de los 2 días de diferencia. Si las fechas aumentan junto con los ID, esto debería 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top