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

Я хотел бы спросить, как я могу избавиться от одних и тех же значений в результате выбора (скриншот ниже), но в этом случае разные символы + и - знак. Я использую SQL Server.

Мое решение: я создал cte (или другой выбор) с уникальным идентификатором, используя concat (No, Value, value2), который будет возвращать только записи с одинаковыми строками, которые отличаются символом (+ и -), а затем окончательный выбор без значений из cte .

select* 
from myTable 
except values from mycte

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

Мой вопрос в том, есть ли более быстрое, лучшее, умное решение для подобной ситуации?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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;

Другие вопросы по теме