Выберите на основе конкретного условия - PullRequest
3 голосов
/ 05 апреля 2019

Если бы кто-то мог обновить заголовок, чтобы лучше отразить мой вопрос, я был бы очень признателен. Я думаю, что изо всех сил пытался найти ответ, потому что я не знаю правильных условий поиска.

Если в таблице есть следующие значения:

TableID      TableSensitivity
-----------------------------
1            aSensitivity
1            aRevision
2            bRevision
3            cRevision
3            cSensitivity

Как я могу отфильтровать значения, содержащие "Revision" только для каждого TableID, где находится уже значение, содержащее «Чувствительность». Это ожидаемый результат:

TableID      TableSensitivity
-----------------------------
1            aSensitivity
2            bRevision
3            cSensitivity

Вот пример настройки:

DECLARE  @Example TABLE (TableID INT, TableSensitivity VARCHAR(200))

INSERT INTO @Example(TableID, TableSensitivity) VALUES (1, 'aSensitivity')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (1, 'aRevision')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (2, 'bRevision')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (3, 'cSensitivity')
INSERT INTO @Example(TableID, TableSensitivity) VALUES (3, 'cRevision')

Я пытался использовать CASE для определения строк с чувствительностью и решил, что могу использовать MAX для фильтрации, но не смог заставить его работать:

SELECT TableID
     , TableSensitivity
     , CASE WHEN TableSensitivity LIKE '%Sensitivity' THEN 1 ELSE 0 END 'SomeKey' 
FROM @Example

Ответы [ 4 ]

3 голосов
/ 05 апреля 2019

Вы можете использовать WHERE NOT EXISTS

SELECT TableID
     , TableSensitivity
FROM @Example e1
WHERE NOT EXISTS
(
    SELECT *
    FROM @Example e2
    WHERE e1.TableID=e2.TableID
    AND e2.TableSensitivity LIKE '%Sensitivity'
    AND e1.TableSensitivity LIKE '%Revision'
)
2 голосов
/ 05 апреля 2019

избавляет от строк в @Example и возвращает ожидаемый результат.при необходимости его можно изменить и включить в ваш запрос:

DELETE
FROM    @Example
WHERE   TableID IN
        (
            SELECT  TableID
            FROM    @Example
            WHERE   TableSensitivity LIKE '%Sensitivity%'
        )
        AND TableSensitivity LIKE '%Revision%'

SELECT  *
FROM    @Example
1 голос
/ 05 апреля 2019

Этого также можно добиться с помощью функции FIRST_VALUE (для SQL Server 2012 и более поздних версий)

SELECT DISTINCT 
    TableID, 
    FIRST_VALUE(TableSensitivity) OVER (PARTITION BY TableID ORDER BY 
            CASE WHEN  TableSensitivity LIKE '%Sensitivity' THEN 1 
            WHEN TableSensitivity LIKE '%Revision' THEN 2 
            ELSE 3 END) as TableSensitivity
FROM @Example
0 голосов
/ 05 апреля 2019

Первоначально я совершенно не понял вопроса.Я вижу, вы хотите запрос расстановки приоритетов.Один простой метод:

select e.*
from @example e
where e.TableSensitivity like '%Sensitivity'
union all
select e.*
from @example e
where e.TableSensitivity like '%Revision' and
      not exists (select 1
                  from @example e2
                  where e2.tableId = e.tableId and
                        e2.TableSensitivity like '%Sensitivity'
                 );

Более общий подход использует row_number():

select e.*
from (select e.*,
             row_number() over (partition by tableId
                                order by case when e.TableSensitivity like '%Sensitivity' then 1 when e.TableSensitivity like '% Revision' then 2 else 3 end
                               ) as seqnum
      from @example e
     ) e
where seqnum = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...