Добавить / удалить оба повторяющихся результата из SQL-запроса на основе флага - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица, в которую входят данные, в которые я хочу захватить все строки с нулевым флагом, а также строки с положительным флагом по своему выбору, а затем я хочу удалить все данные из запроса, который содержит одинаковыеданные, но имеет отрицательное значение флага. В настоящее время я обрабатываю все это во внешнем интерфейсе, собирая все мои 0 и положительные значения флага, затем собирая все мои отрицательные значения и удаляя их из моего первого результата, установив все строки с флагом> = 0, которые соответствуют строкам отрицательного флага.

Эти вещи всегда немного описать словами, поэтому вот пример с моим набором данных, который выглядит примерно так:

flag    name    loc
0       Fred    USA
-1      Fred    USA
1       Fred    CANADA
0       Ryan    CANADA
0       Steph   SPAIN
-1      Steph   SPAIN
1       Steph   CANADA
-2      Steph   CANADA
2       Steph   RUSSIA

Если бы я хотел, чтобы все данные были помечены флагом1, я ожидал бы вернуть следующее

flag    name    loc
1       Fred    CANADA
0       Ryan    CANADA
1       Steph   CANADA

Если бы flag был просто 2, я бы хотел

flag    name    loc
0       Fred    USA
0       Ryan    CANADA
2       Steph   RUSSIA

И, наконец, если flag был 1 ИЛИ 2, я бы хотел

flag    name    loc
1       Fred    CANADA
0       Ryan    CANADA
2       Steph   RUSSIA

Обратите внимание, что хотя флаг в этом примере выглядит последовательным, нельзя предполагать, что отмеченный выше элемент является последней помеченной строкой, которую нужно выбрать. Кроме того, это подзапрос для более крупного запроса, который собирает информацию на основе этого запроса. Основной запрос может содержать любое количество флагов.

Эта операция выполнима в запросе, или я должен продолжать выполнять тяжелую работу во внешнем интерфейсе?

Скрипка: http://sqlfiddle.com/#!18/de297/1

Спасибо

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Если я правильно понимаю, это расстановка приоритетов с фильтрацией:

select *
from (select t1.*,
             row_number() over (partition by name order by flag desc) as seqnum
      from table1 t1
      where flag in (0, 1)
     ) t1
where seqnum = 1;

Условие where содержит список допустимых значений флага. Кажется, вы всегда хотите 0 в этом списке.

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

0 голосов
/ 07 ноября 2019

Это удовлетворяет вашим первым двум требованиям, но я не уверен, что если

, если флаг равен 1 или 2, я бы хотел, чтобы

означало

DECLARE @YourInt INT = 2     

SELECT    flag,
          name,
          loc
INTO      #YourInts
FROM      table1
WHERE     flag = @YourInt

SELECT   flag,
         name,
         loc
FROM     #YourInts
UNION ALL
SELECT   flag,
         name,
         loc
FROM     table1
WHERE    flag = 0 AND
         name NOT IN (SELECT name FROM #YourInts WHERE flag = @YourInt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...