2015-01-24 3 views
0

Возможно ли иметь неагрегатное состояние для групп? Например, мы имеем:Группа по условию без агрегата

Table1(firstName, lastName, gender) 

И мы группа поfirstName, а затем lastName, но мы хотим только группы, имеющие по крайней мере 5 мужчин в этом. Или другим примером являются группы без каких-либо мужских или других условий. На самом деле я решил это, используя случай, когда, но я смотрю, есть ли для него прямое решение. Другой формой этой проблемы является то, когда мы хотим только группы, которые содержат по крайней мере одного человека старше 18 лет, или любой такой вопрос.

+0

Определив количество самцов, вам не нужно будет включать агрегат в 'COUNT' количество мужчин? –

+0

Вы можете предварительно фильтровать агрегат с 'WHERE' и/или фильтровать агрегатную статистику с помощью' HAVING'. –

ответ

1

Я не знаю, похоже ли это на ваше «решение, использующее случай», но я считаю, что это самый простой способ сделать это.

В принципе, вместо подсчета вы можете суммировать количество строк, соответствующих условию, поэтому шаблон всегда: SUM(CASE WHEN <condition> THEN 1 [ELSE 0] END. В предложении HAVING вы можете фильтровать такие скопления.

С count не учитывается null s, вы также можете написать COUNT(CASE WHEN <condition> THEN 1 [ELSE null] END). Этот метод, возможно, более ясен, чем способ SUM, но я больше привык к этому.

SELECT 
    FirstName, LastName 
FROM 
    Table1 
GROUP BY 
    FirstName, LastName 
HAVING 
    SUM(CASE WHEN Gender = 'M' THEN 1 ELSE 0 END) >= 5 

Приведенное выше условие относится к «не менее 5 самцов».

Чтобы написать «exacty 3 женщин и, по меньшей мере, один человек старше 18 лет», вы могли бы сделать это следующим образом:

HAVING 
    SUM(CASE WHEN Gender = 'F' THEN 1 ELSE 0 END) = 3 
    SUM(CASE WHEN Age > 18 THEN 1 ELSE 0 END) >= 1 

Этих условия работают отдельно, так и в состоянии выше, в 18-летний человек может быть одной из трех женщин или парней. Но вы также можете комбинировать условия внутри корпуса. Например: «по крайней мере, 5 человек, которые 18 лет и старше»:

HAVING 
    SUM(CASE WHEN Gender = 'M' AND Age >= 18 THEN 1 ELSE 0 END) >= 5 

Я надеюсь, что эти примеры помогут вам найти условие, что вам нужно.

+0

Спасибо. Это именно то, что я искал. Но у меня есть другой вопрос. Как насчет того, хотим ли мы группировать по списку A, но только группы, которые включают по меньшей мере n членов списка B. –

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