Question SQL: Obtenir des enregistrements en fonction datediff d'un enregistrement à
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!
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;