SQL-вопрос:Получение записей на основе datediff от записи к записи
Вопрос
Ладно, тут есть одна хитрость...Если мои данные выглядят следующим образом:
Таблица 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
Как мне получить записи с разницей в 2 дня друг от друга?Мой конечный результирующий набор должен состоять из строк 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, где dateiff(dd,t1.date_created,t2.date_created) = 2 И t1.id != t2.id ORDER BY 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, как вы сказали, если вы хотите получить строки, которые являются частью В ТЕЧЕНИЕ 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;
Я надеюсь, что это поможет....
С уважением, Шрикришна.
Курсор будет самым быстрым, но вот запрос 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;