Выбор записей с одинаковыми категориями, но с целыми числами - PullRequest
2 голосов
/ 09 апреля 2020

Это характер таблицы, с которой я работаю:

IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
  DROP TABLE #TEMP

CREATE TABLE #TEMP (
  CategoryA         NVARCHAR(10),
  CategoryB         NVARCHAR(10),
  CategoryC         NVARCHAR(10),
  IntegerA          INT,
);

INSERT INTO #TEMP(CategoryA,CategoryB,CategoryC,IntegerA)
VALUES  
('A','H','G',20),
('A','H','G',-15),
('F','L','C',10),
('N','U','X',12),
('K','G','G',15),
('K','G','G',-10);

SELECT * FROM #TEMP

Обратите внимание, что верхние 2 строки и нижние 2 строки имеют одинаковые категории, однако они имеют целые числа противоположной полярности. Средние 2 строки отличаются положительными целыми числами.

Мне нужен способ выбрать все записи, которые не дублируются (например, средние 2 строки). И мне нужно выбрать записи с отрицательными целыми числами, не выбирая их положительных контрагентов.

В этом случае желаемым выводом будет:

DESIRED OUTPUT

Я пытался выяснить, могу ли я создать свою собственную таблицу, в которую вставляются только те записи, которые мне нужны, но я снова сталкиваюсь с той же проблемой, когда не могу понять, как отличить guish между записями, где все категории одинаковы.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Для этого набора данных вы можете просто использовать row_number():

select categoryA, categoryB, categoryC, integerA
from (
    select 
        t.*, 
        row_number() over(partition by categoryA, categoryB, categoryC order by integerA) rn
    from temp t
) t
where rn = 1
2 голосов
/ 09 апреля 2020

Хммм. , , Я думаю, что вы хотите:

select t.*
from #temp t
where t.integerA < 0 or
      not exists (select 1
                  from #temp t2
                  where t2.A = t.A and t2.B = t.B and
                        t2.C = t.c and t2.integerA < 0
                 );

Здесь - это дб <> скрипка.

...