Как выбрать строки, если у нас есть дата в пределах 1 дня в sql разработчике - PullRequest
0 голосов
/ 19 июня 2020

Если у меня есть таблица с именем столбца и Creation_Date, которая выглядит как

Name, Creation
Sam, 01/01/2020
Sam, 01,02,2020
Jack, 12/31/2019
Jack, 10/21/2018
Jack, 12/30/2019
Hank, 01/01/2019

Я хочу, чтобы имя совпадало, а дата создания для этого имени находится в пределах +/- 1 дня, я хотел бы получить эти строки. В этом случае мне нужны 4 строки данных на выходе. Я могу фильтровать только по определенному диапазону, но не по уровню имени.

EDIT: ожидаемые строки:

Name, Creation
Sam, 01/01/2020
Sam, 01,02,2020
Jack, 12/31/2019
Jack, 10/21/2018

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Самостоятельное присоединение может помочь.

SQL> with test (name, creation) as
  2    (select 'Sam' , date '2020-01-01' from dual union all
  3     select 'Sam' , date '2020-01-02' from dual union all
  4     select 'Jack', date '2019-12-31' from dual union all
  5     select 'Jack', date '2018-10-21' from dual union all
  6     select 'Jack', date '2019-12-30' from dual union all
  7     select 'Hank', date '2019-01-01' from dual
  8    )
  9  select a.name, a.creation
 10  from test a join test b on a.name = b.name
 11               and abs(a.creation - b.creation) = 1
 12  order by name, creation;

NAME CREATION
---- ----------
Jack 12/30/2019
Jack 12/31/2019
Sam  01/01/2020
Sam  01/02/2020

SQL>

(Кстати, я думаю, вы неправильно указали Jack в качестве желаемого результата; не тот, что был в 2018 году, а в 2019 году).

0 голосов
/ 19 июня 2020

Вы можете использовать функции аналити c. Например:

select t.*
from (select t.*,
             count(*) over (partition by name
                            range between interval '1' day preceding and interval '1' day following
                           ) as cnt
      from t
     ) t
where cnt > 1;
...