Удалить повторяющиеся строки по значению - PullRequest
2 голосов
/ 30 января 2010

Мне нужно выполнить группирование по, но только для строк, которые удовлетворяют условию, в противном случае возвращаются все строки, которые не удовлетворяют условию. Например, в следующей таблице я хочу сгруппировать только те строки, которые имеют «1» в поле «активные», и вернуть все строки, которые не имеют.

TABLE (id, label, active):

1, A, 1
2, A, 1
3, B, 0
4, B, 0

Вернется:

1, A, 1
3, B, 0
4, B, 0

Ответы [ 3 ]

3 голосов
/ 30 января 2010

Вот самый простой способ, который я могу придумать. Это утверждение в группе по. Если условие выполняется, сгруппируйте по метке, в противном случае сгруппируйте по первичному ключу.

SELECT id, label, active
FROM table
GROUP BY
  CASE
    WHEN active = 1 THEN active
    ELSE id END

Если вы хотите сгруппировать по активным и метке:

SELECT id, label, active
FROM table
GROUP BY
  CASE
    WHEN active = 1 THEN active
    ELSE id END,
  label

РЕДАКТИРОВАТЬ: Я неправильно понял, на каком поле вы хотите сгруппировать. Исправлено сейчас.

0 голосов
/ 30 января 2010

Возможно, макет запроса может выглядеть примерно так:

select
  min(id),
  label,
  max(active)
from
  Foo
where
  active = 1
group by
  label

union

select
  id,
  label,
  active
from
  Foo
where
  active = 0
0 голосов
/ 30 января 2010

Вы можете использовать оператор CASE

select min(id) as id, label, active
from (
     select id, label, active,
           case
             when active = 1 then 'active'
             else convert(varchar,newid()) as discriminator
           end
     from table) t
group by label, active, discriminator

это даст общее значение для всех строк, которые удовлетворяют условию (active = 1), и уникальное значение для всех остальных строк, чтобы они оставались разгруппированными.

В данный момент у меня нет доступа к SQL-серверу, так что это полностью не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...