2010-01-30 8 views
2

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

TABLE (идентификатор, метка, активный):

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

вернуться бы:

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

Это довольно двусмысленный вопрос. Ожидание обновления значительного размера. –

+0

где пример .. – Amirshk

ответ

3

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

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 

EDIT: Я не понял, какое поле вы хотите сгруппировать в. Исправлено сейчас.

+0

Мне нравится, когда ответ такой простой. Я смущен. Я не думал об этом. – scader

0

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

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-серверу на данный момент, так что это полностью непроверено.

+0

Итак ... SELECT id, label, active, case, когда active = 1, затем null else convert (varchar, newid()) end как groupit group by groupit К сожалению, я буду использовать агрегированные функции для многих других полей, которые также возвращаются, но я думаю, что я могу получить исходные данные для группировки сначала в качестве подбора, а затем присоединиться к разным данным. – scader

+0

Является ли ресурс интенсивным? – scader

+0

Я предпочитаю свой метод, так как нет подзапроса и повторного использования поля id, поскольку уникальная опция в выражении case уменьшает пару вызовов функций. Однако, если вы собираетесь с этим, я думаю, вам нужно удалить столбец id из предложения GROUP BY. В противном случае он вернет все строки без группировки. –

0

Возможно расположение запроса может быть что-то вроде этого:

Смежные вопросы