Вопрос SQL: Получение записей на основе даты от записи к записи - PullRequest
2 голосов
/ 16 июля 2009

Хорошо, тут есть хитрость ... Если мои данные выглядят так:

Table1

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

Как мне получить записи, которые находятся на расстоянии 2 дня друг от друга? Мой конечный набор результатов должен быть строками 1-3 и 5-6. Спасибо!

Ответы [ 7 ]

1 голос
/ 16 июля 2009
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)
0 голосов
/ 16 июля 2009

Курсор будет самым быстрым, но вот запрос SELECT, который сделает это. Обратите внимание, что вместо "до N" дней вместо 2 вам придется заменить таблицу Two таблицей целых чисел от 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;
0 голосов
/ 16 июля 2009

Если вы хотите получить строки, которые находятся на расстоянии не более 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;

для примера, как вы сказали, если вы хотите получить строки, которые находятся в течение 2 дней, Вы можете использовать ниже:

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;

Надеюсь, это поможет ....

С уважением, Srikrishna.

0 голосов
/ 16 июля 2009
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
0 голосов
/ 16 июля 2009

Я мог бы предложить использовать программный код для этого. Вы хотите собрать группы строк (отдельные группы). Я не думаю, что вы можете решить эту проблему с помощью одного запроса (который вернет вам только один набор строк).

0 голосов
/ 16 июля 2009

- что это тебе дает?

выберите DISTINCT 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.id;

0 голосов
/ 16 июля 2009

Будет ли это работать?

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