2015-01-08 5 views
2

Если вы изучите этот стол на мгновение, вы увидите Dave уникален тем, что он выиграл multiple awards in a single year, и он сделал это for multiple years.Как запросить счет в пределах подсчета (без использования подзапроса)?

 
person award year 
------------------------------- 
Dave red  2015 
Dave blue 2015 
Dave red  2013 
Dave green 2013 
Susan blue 2015 
Susan green 2011 
Susan red  2011 
Susan red  2010 
Tom  red  2012 
Tom  blue 2012 
Tom  green 2012 
Tom  yellow 2012 
Tom  purple 2012 

Есть ли способ для запроса Dave (победитель многих награды более чем на 1 год) без использования подзапроса?
Например, вы можете сказать GROUP BY person HAVING COUNT(DISTINCT year) > 1 AND COUNT(*) > 3, но это также даст Сьюзен.

+0

Почему у вас есть ограничение на использование подзапроса? –

+1

Сразу после того, как я разместил этот вопрос, я понял, что суб-запрос будет в порядке. Но вопрос все еще остается? Есть ли простой способ достичь этого? Я не думаю ... – prograhammer

+0

@DavidGraham - вы должны отредактировать свой вопрос, не ограничивая подзапрос ... Я разместил решение, используя один - не уверен, что это возможно без него. – sgeddes

ответ

3

Я думаю, вы могли бы использовать это:

select a1.person 
    from awards a1 
    join awards a2 
    on a1.person = a2.person 
    and a1.year = a2.year 
    and a1.award <> a2.award 
group by a1.person 
having count(distinct a1.year) > 1 

Fiddle: http://sqlfiddle.com/#!2/b98bf/8/0

Но вы бы лучше с подзапроса:

select person 
    from (select person, year, count(*) as num_in_yr 
      from awards 
     group by person, year) x 
group by person 
having sum(num_in_yr >= 2) >= 2 

Fiddle: http://sqlfiddle.com/#!2/b98bf/7/0

+0

А, я вижу, что вы здесь делали ... используя дополнительный 'JOIN', чтобы каждый человеко-год должен иметь« пару »(тогда« отличать »от повторяющихся лет) и считать. Умная! И, как вы упомянули, я должен, вероятно, просто придерживаться подзапроса (который я использую все время, но теперь я подтвердил, что не так много другого решения). Благодаря! – prograhammer

+0

Определенно очень умное решение. –

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

  • Нет связанных вопросов^_^