2012-11-02 66 views
2

我有与列COL1,COL2,COL3多条记录表ABC,SQL查询的Teradata

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 

。我该怎么做。?

+0

经典[标签:最大正每组]问题。没有时间写一个答案,你应该检查了这一点:http://stackoverflow.com/a/7745635/570191 –

+2

@Adrian - 实际上,它只是一个'按任意顺序排序'和MAX()'问题。 – MatBailie

+0

@Dems我的天啊,你是对的。我确实说过我没时间仔细观察,对吧? :) –

回答

3
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 
+0

+1正在等待您添加GROUP BY :) –

0

这应该工作:

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 
+0

解释您的答案的评论? – Shikiryu