2013-03-01 29 views
3

我試圖採取與信息的表如下:SQL MIN跨越與一組多個列BY

+----+---+---+ 
| ID | X | Y | 
+----+---+---+ 
| A | 1 | 3 | 
| A | 1 | 1 | 
| A | 1 | 2 | 
| A | 1 | 7 | 
| B | 2 | 2 | 
| B | 3 | 3 | 
| B | 1 | 9 | 
| B | 2 | 4 | 
| B | 2 | 1 | 
| C | 1 | 1 | 
+----+---+---+ 

我希望能夠選擇在這兩個欄目的最小值,通過分組第一列 - 「X」列比Y列更重要。因此,例如,查詢應返回如下內容:

+----+---+---+ 
| ID | X | Y | 
+----+---+---+ 
| A | 1 | 1 | 
| B | 1 | 9 | 
| C | 1 | 1 | 
+----+---+---+ 

任何想法?到目前爲止,我已經完成了數十個帖子和實驗,並且沒有運氣。

謝謝, 詹姆斯

+2

你正在使用什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,對於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等... – 2013-03-01 18:19:07

+0

但是ID B的最小Y是1,而不是9 – amphibient 2013-03-01 18:20:26

回答

3

你似乎想具有最小x值。而且,如果x上有重複,那麼取最小y的那個。

爲此,使用row_number()

select id, x, y 
from (select t.*, 
      row_number() over (partition by id order by x, y) as seqnum 
     from t 
    ) t 
where seqnum = 1 

如果你的數據庫不支持窗口的功能,你仍然可以在SQL表達這樣的:

select t.id, t.x, min(t.y) 
from t join 
    (select id, MIN(x) as minx 
     from t 
     group by id 
    ) tmin 
    on t.id = tmin.id and t.x = tmin.minx 
group by t.id, t.x 
2

如果您的RDBMS支持窗口功能,

SELECT ID, X, Y 
FROM 
     (
      SELECT ID, X, Y, 
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY X, Y) rn 
      FROM tableName 
     ) d 
WHERE rn = 1 
+0

工作起來就像一個魅力。對於任何人想知道,通過JOINS/etc從其他表中獲取信息,在子查詢中找到joi,然後從那裏開始。 – 2013-03-01 19:20:16