SQL Server: как избавиться от одинаковых / противоположных значений ( и — знак) из результата выбора

#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;