Question SQL: Obtenir des enregistrements en fonction datediff d'un enregistrement à

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

  •  16-09-2019
  •  | 
  •  

Question

Ok, a obtenu une délicate ici ... Si mes données ressemble à ceci:

Tableau 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

Comment puis-je obtenir les documents qui sont 2 jours d'intervalle les uns des autres? jeu Mon résultat final devrait être des lignes 1-3 et 5-6. Merci!

Était-ce utile?

La solution

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

Autres conseils

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'est-ce que cela vous donne

select DISTINCT t1.id, t1.date_created, t2.id, t2.date_created de t1 table1, t2 où table1 datediff (dd, t1.date_created, t2.date_created) = 2 ET t1.id! = T2.id ORDER BY t1.id;

Est-ce que ce travail?

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

Je pourrais vous suggérons d'utiliser le code de programmation pour le faire. Vous souhaitez collecter des groupes de lignes (groupes séparés). Je ne pense pas que vous pouvez résoudre cela en utilisant une seule requête (qui vous donne juste un ensemble de lignes arrière).

Si vous voulez obtenir les lignes qui sont dans « N » jours d'intervalle, vous pouvez essayer ceci:

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;

pour exmaple, comme vous le dites, si vous voulez obtenir les lignes qui sont dans les 2 jours une partie, vous pouvez utiliser le ci-dessous:

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;

J'espère que cette aide ....

Cordialement, Srikrishna.

Un curseur sera le plus rapide, mais voici une requête SELECT qui va le faire. Notez que pour « jusqu'à N » jours d'intervalle au lieu de 2, vous devrez remplacer la table deux avec une table des nombres entiers de 0 à N-1 (et l'efficacité sera empirer).

Je l'admets n'est pas tout à fait clair ce que vous voulez, mais je suis suppose que vous voulez que les gammes de lignes qui contiennent au moins deux rangées en tout et dans lequel les rangées successives sont au plus 2 jours d'intervalle. Si les dates augmentent avec ID, cela devrait fonctionner.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top