SQL سؤال: الحصول على سجلات بناء على datediff من سجل إلى سجل

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

  •  16-09-2019
  •  | 
  •  

سؤال

حسنا، حصلت على صعبة هنا ... إذا كانت بياناتي تبدو وكأنها هذه:

الجدول 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

كيف يمكنني الحصول على السجلات التي هي يومين بصرف النظر عن بعضها البعض؟ يجب أن تكون مجموعة النتيجة النهائية صفوفا 1-3 و 5-6. شكرا!

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

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)

- ماذا يعطيك هذا؟

اختر T1.ID متميزة، T1.Date_Created، T2.ID، T2.Date_Created من Table1 T1، Table1 T2 حيث Datediff (DD، T1.Date_Created، T2.Date_Created) = 2 و T1.ID! = T2.ID من قبل T1 .هوية شخصية؛

هل هذا العمل؟

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

قد أقترح استخدام رمز البرمجة للقيام بذلك. تريد جمع مجموعات من الصفوف (مجموعات منفصلة). لا أعتقد أنه يمكنك حل هذا باستخدام استفسار واحد (الذي من شأنه أن يمنحك مجموعة واحدة فقط من الصفوف مرة أخرى).

إذا كنت ترغب في الحصول على الصفوف الموجودة في غضون أيام "N"، فيمكنك تجربة هذا:

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;

بالنسبة إلى Exmaple، كما قلت، إذا كنت ترغب في الحصول على الصفوف التي هي في غضون يومين جزء، يمكنك استخدام أدناه:

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;

آمل أن يساعد هذا....

التحيات، سريشنا.

سيكون المؤشر أسرع، ولكن هنا هو استعلام محدد يقوم بذلك. لاحظ أنه لأيام "Up to n" بصرف النظر بدلا من 2، عليك استبدال الجدول اثنين مع جدول أعداد صحيحة من 0 إلى N-1 (والكفاءة ستزداد سوءا).

أنا أعترف أنه ليس واضحا تماما ما تريد، لكنني أعتقد أنك تريد أن نطاقات الصفوف التي تحتوي على صفين على الأقل في كل شيء وداخل الصفوف المتتالية في أكثر أيام 2 أيام. إذا كانت التواريخ تزيد جنبا إلى جنب مع معرفات، فيجب أن يعمل هذا.

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top