#sql #sql-server
#sql #sql-сервер
Вопрос:
Я хотел бы спросить, как я могу избавиться от тех же значений из результата выбора (скриншот ниже), но другого символа в данном случае и — знак. Я использую SQL Server.
Мое решение: я создал cte
(или другой выбор) с уникальным идентификатором, используя concat
(No, Value, value2), который будет возвращать только записи с одинаковыми строками, которые отличаются символом ( и -), затем окончательный выбор без значений из cte.
select*
from myTable
except values from mycte
Мой вопрос в том, есть ли какое-либо более быстрое, лучшее, умное решение для подобной ситуации?
Ответ №1:
Я думаю not exists
, делает то, что вы хотите. Предполагая, что symbol
принимает только значения ' '
и '-'
:
select t.*
from myTable t
where not exists (select 1
from myTable t2
where t2.no = t.no and t2.date = t.date and
t2.value = t.value and
t2.value2 = t.value2 and
t2.provision = t.provision and
t2.symbol <> t.symbol
);
Если symbol
может принимать другие значения, добавьте условие t2.symbol in (' ', '-') and t.symbol in (' ', '-')
.
Вы также можете подойти к этому с помощью оконных функций. Предполагая, что символом является либо
или -
, и есть не более двух строк, которые дублируются:
select t.*
from (select t.*,
min(symbol) over (partition by no, date, value, value2, provision) as min_symbol,
min(symbol) over (partition by no, date, value, value2, provision) as max_symbol
from mytable t
) t
where min_symbol <> max_symbol;