sql найти в пределах даты - PullRequest
0 голосов
/ 09 мая 2018

Допустим, у нас есть две таблицы

Table A:
col_1,   col_2,   col_3,   col4
04/04/2017 1800.00  200.00 B123
21/04/2017 1800.00  200.00 B123
14/09/2017 1200.00  300.00 B123
18/12/2017 1100.00  150.00 B123
21/01/2018 1100.00  150.00 B123
06/05/2017 2400.00  500.00 A345



Table B:
col_1,   col_2,   col_3,  col4
05/04/2017 1800.00,  200.00 B123
12/09/2017 1200.00,  300.00 B123
20/12/2017 1100.00,  150.00 B123
08/05/2017 2400.00   500.00 A345

Я хочу сделать что-то вроде

select * from A 
where (col_1, col_2, col_3, col_4) 
    not in (select +/- 2 days_of_col_1, col_2, col_3, col_4 from B.

Можно ли это сделать. если да, то как.

Заранее спасибо за помощь ...

РЕДАКТИРОВАТЬ: @ Гордон. Скажем, таблица А имела дополнительные строки, как показано ниже

05/04/2017 1800.00  200.00 B123
05/04/2017 1800.00  200.00 B123
06/04/2017 1800.00  200.00 B123

это будет помечено как существующее. Я пытался использовать

count (*) OVER (PARTITION BY col_1, col_2 ORDER BY col_1, col_2)  AS count_col_2,
count (*) OVER (PARTITION BY col_1, col_2 ORDER BY col_1, col_3)  AS count_col_3

и поставить чек на счет, как в вашем решении. Это обнаруживает только одну и ту же дату нескольких записей. Надеюсь, вы можете что-то предложить. Еще раз спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Думаю, что-то подобное тоже может сработать:

 select * from A a
 left join B b
 on a.col_1 between dateadd(-2, dd, b.col_1) and dateadd(2, dd, b.col_1)
 and a.col_2 between dateadd(-2, dd, b.col_2) and dateadd(2, dd, b.col_2)
 and a.col_3 between dateadd(-2, dd, b.col_3) and dateadd(2, dd, b.col_3)
 and a.col_4 between dateadd(-2, dd, b.col_4) and dateadd(2, dd, b.col_4)
 where b.col_1 is null
0 голосов
/ 09 мая 2018

Я думаю not exists - ваша лучшая ставка:

select a.*
from a
where not exists (select 1
                  from b
                  where b.col_2 = a.col_2 and b.col_3 = a.col_3 and b.col_4 = a.col_4 and
                        a.col_1 >= b.col_1 - interval '2 day' and
                        a.col_1 <= b.col_1 + interval '2 day'
                 );
...