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!

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top