SQL Frage: Werden Aufzeichnungen basierend auf datediff von Rekord Rekord
Frage
Ok, bekam eine knifflige Frage hier ... Wenn meine Daten wie folgt aussieht:
Tabelle 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
Wie kann ich die Datensätze erhalten, sind 2 Tage voneinander? Mein Endergebnis Satz sollte Reihen 1-3 und 5-6 sein. Dank!
Lösung
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
Andere Tipps
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)
- was diese Ihnen nicht geben
DISTINCT t1.id wählen, t1.date_created, t2.id, t2.date_created von table1 t1, t2 table1 wo datediff (dd, t1.date_created, t2.date_created) = 2 und t1.id! = T2.id ORDER BY t1.id;
Würde das funktionieren?
select t1.id, t2.id
from table1 t1
join table1 t2
on t2.date_created - t1.date_created <= 2
Ich könnte mit Programmcode vorschlagen, es zu tun. Sie wollen Gruppen von Zeilen (getrennter Gruppen) zu sammeln. Ich glaube nicht, können Sie lösen diese eine einzige Abfrage (die Sie nur einen Satz von Zeilen zurück geben würde).
Wenn Sie die Zeilen erhalten möchten, die neben WITHIN ‚N‘ Tage sind, können Sie dies versuchen:
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;
für exmaple, wie Sie gesagt haben, wenn Sie möchten, um die Zeilen zu erhalten, die innerhalb von 2 Tagen ein Teil sind, Sie können die folgenden verwendet werden:
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;
Ich hoffe, das hilft ....
Viele Grüße, Srikrishna.
Ein Cursor wird am schnellsten, aber hier ist eine SELECT-Abfrage, die es tun wird. Beachten Sie, dass für „bis zu N“ Tage auseinander statt 2 musst du die Tabelle Zwei mit einer Tabelle von Zahlen von 0 bis N-1 ersetzen (und die Effizienz wird noch schlimmer).
Ich gebe zu, es ist nicht ganz klar, was Sie wollen, aber ich bin erraten Sie die Bereiche der Zeilen möchten, dass die aufeinanderfolgenden Reihen höchstens 2 Tage sind mindestens zwei Reihen in allen und innerhalb dessen enthalten auseinander. Wenn Daten zusammen mit IDs zu erhöhen, sollte das funktionieren.
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;