Ниже приведены две таблицы.
Я хочу найти и объединить записи между двумя таблицами, имеющими значение -1 или +1. Но в этом случае он также возвращает мне дубликаты записей. Как я могу получить результат без дубликатов записей?
drop table if exists #A
CREATE TABLE #A(ID float, Category varchar(10), Amount float )
insert into #A values
(1,'A',150.4),
(2,'A',151.0),
(3,'A',149.8),
(4,'A',165.0),
(5,'A',165.0)
drop table if exists #B
CREATE TABLE #B(BID float, BCategory varchar(10), BAmount float )
insert into #B values
(95,'A',151),
(101,'A',150),
(115,'A',165.0),
(118,'A',165.0)
Я пробовал следующий запрос, который возвращает дубликаты.
select *
from
(select
ID, category, Amount,
row_number() over (partition by category, Amount order by category, Amount) as Sr
from #A) A
full outer join
(select
BID, Bcategory, BAmount,
row_number() over (partition by Bcategory, BAmount order by Bcategory, BAmount) as Sr
from #B) B on a.category = b.bCategory
and a.amount between b.bamount - 1 and b.BAmount + 1
and a.sr = b.sr
Логика: как текущий пользовательСопоставление вручную: -
Сначала попробуйте Точное совпадение (категория и сумма) с другой таблицей. Затем все, что осталось, попытается сопоставить Категорию и Сумму с (+/- 1) Таблицы B.
Таким образом, 149,8 или 150,4 от A, оба могут присоединиться к 150 из B. Поскольку только один (150) в Таблице Bосталось, а 151 уже назначено 151 при точном совпадении, одна запись A будет объединена с нулем.
Скажем, так как 150.4 появляется первым в таблице A, оно может идти с 150 в TableB.
и 149,8 останутся непревзойденными. Практически пользователь не против того, чтобы совпадать ни с, ни с. Важно то, что любая строка (150,4 или 149,8) должна соответствовать нулю. Проблема с левым или полным внешним соединением заключается в том, что 150 из B назначается обоим (149,8 и 150,4).