2012-11-02 63 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