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

Как мне получить записи с разницей в 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top