SQL-запрос Teradata

У меня есть таблица abc, в которой много записей со столбцами col1, col2, col3,

dept         | name |  marks |

science         abc      50
science         cvv      21
science         cvv      22  
maths           def      60
maths           abc      21
maths           def      62
maths           ddd      90

Мне нужно заказать по отделу и имени с ранжированием как ddd- 1, cvv - 2, abc -3, иначе 4, затем нужно узнать максимальную оценку человека. Ожидаемый результат

dept         | name |  marks |

science         cvv      22
science         abc      50
maths           ddd      90
maths           abc      21
maths           def      62

. Как я могу это сделать.?


person rahul kanakarajan    schedule 02.11.2012    source источник
comment
Классическая самая большая-n-per-group проблема. нет времени, чтобы написать ответ, вы должны проверить это: stackoverflow.com/a/7745635/570191   -  person Adriano Carneiro    schedule 02.11.2012
comment
@ Адриан - На самом деле, это всего лишь вопрос Sort by an arbitrary order и MAX().   -  person MatBailie    schedule 02.11.2012
comment
@Dems Боже мой, ты прав. Я сказал, что у меня не было времени для более внимательного изучения, верно? :)   -  person Adriano Carneiro    schedule 02.11.2012


Ответы (2)


SELECT
  dept,
  name,
  MAX(marks)   AS mark
FROM
  yourTable
GROUP BY
  dept,
  name
ORDER BY
  CASE WHEN name = 'ddd' THEN 1
            name = 'cvv' THEN 2
            name = 'abc' THEN 3
                         ELSE 4 END

Или, что предпочтительнее, иметь другую таблицу, включающую порядок сортировки.

SELECT
  yourTable.dept,
  yourTable.name,
  MAX(yourTable.marks)   AS mark
FROM
  yourTable
INNER JOIN
  anotherTable
    ON yourTable.name = anotherTable.name
GROUP BY
  yourTable.dept,
  youtTable.name
ORDER BY
  anotherTable.sortingOrder
person MatBailie    schedule 02.11.2012

Это должно работать:

SELECT Dept, Name, MAX(marks) AS mark
FROM yourTable
GROUP BY Dept, Name
ORDER BY CASE WHEN Name = 'ddd' THEN 1
              WHEN Name = 'cvv' THEN 2
              WHEN Name = 'ABC' THEN 3
              ELSE 4 END
person user2400820    schedule 20.05.2013
comment
Комментарий, объясняющий ваш ответ? - person Shikiryu; 20.05.2013