2013-11-29 6 views
2

Я застрял на чем-то, что, по-моему, должно быть довольно простым, я искал какое-то время в теге Greatest-N-Per-Group и вообще google-fu и не могу найти что-то, что вполне подходит.SQL Greatest N Per Group с дополнительными критериями

У меня есть запрос, который (в упрощенной форме) принимает таблицу данных и выполняет на ней агрегации/группировки, но я хочу ввести уникальный идентификатор, основанный на максимальном значении другого столбца.

Чтобы дать пример того, что значит:

Uniq Value Time Person 
1 6  180 Bob 
2 8  170 Bob 
3 4  45 Claire 
4 4  90 Claire 

Текущий запрос будет:

SELECT Person, SUM(Time) AS Duration 
FROM Table 
GROUP BY Person 

Что мне нужно, чтобы добавить к этому результирующий набор является Uniq и значение наибольшего значения в человек, т.е. набор результатов будет выглядеть так:

Person Duration Value Uniq 
Bob 350  8  2 
Claire 135  4  3 

Первоначально я думал, что я мог бы присоединиться первые результаты, установленные для подзапроса, содержащего максимальное число (значение), лицо и Uniq, но потом я бегу по проблеме возвращения один результат на Uniq, а не один для человека, но только uniq, где строка является максимальным значением.

Любая помощь будет высоко оценена.

+1

Какие СУБД вы используете? Postgres? Oracle? –

ответ

3

Для достижения этой цели deterministicly вам нужно зарегистрироваться обратно к столу:

SELECT MaxT.Person, 
     MaxT.Duration, 
     T.Value, 
     MIN(T.Uniq) AS Uniq 
FROM T 
     INNER JOIN 
     ( SELECT Person, SUM(`Time`) AS Duration, MAX(Value) AS Value 
      FROM T 
      GROUP BY Person 
     ) MaxT 
      ON MaxT.Person = t.Person 
      AND MaxT.Value = t.Value 
GROUP BY MaxT.Person, MaxT.Duration, MaxT.Value; 

Example on SQL Fiddle

+1

Жаль, что у меня была репутация для этого - это работает как шарм и близко к тому, что у меня уже было (у меня только что был Uniq внутри подзапроса), хотя мне потребовалось всего 15, чтобы следовать ему, и выясните, почему uniq из основного запроса работал! – David

+0

@ Давид, не волнуйся, я поднимусь для вас обоих! +1 – Kaf

0

попробовать это

SELECT Person, SUM(TIME) AS Duration, MAX(VALUE) AS `value`, MAX(Uniq) AS Uniq 
FROM TABLE 
GROUP BY Person 
Смежные вопросы