2012-03-29 51 views
0

正在尋找一段時間,但還沒有找到適合我的問題的答案。來自兩列的最小值(Oracle SQL)

說明:

 
ID | Year | Factor1 | Number1 | Number2 
1 | 2010 | 213 | 1  | 1  
2 | 2010 | 213 | 1  | 2  
3 | 2010 | 214 | 2  | 1  
4 | 2010 | 214 | 2  | 2  
6 | 2010 | 210 | 3  | 1  
7 | 2010 | 210 | 3  | 2 
8 | 2011 | 250 | 3  | 5 
5 | 2012 | 214 | 2  | 4  

編輯: 忘帶了什麼東西,校正,在上述表中。 我需要2種組合:year和factor1只有一次,然後是min(number1)和last min(number2)。 例如,上面我需要ID 1,3,5,6,8(對不起,它們混合在一起以提高其他值的可讀性)。

任何任何想法如何實現?

+1

你爲什麼要保留記錄3和6,但丟棄記錄2? – APC 2012-03-29 12:45:35

+0

你想刪除除一年中的min(Number1)和min(number2)以外的任何「..形式指定的例子id 2有最小數字1 = 1和and id 8數字1和2不是最小值,所以爲什麼是你刪除他們...如果你給一個更好的解釋,這可以被擱置....希望我沒有進一步混淆你...... – 2012-03-29 12:45:35

+0

你是什麼意思,但只有兩者的結合? – 2012-03-29 12:50:44

回答

1

從另一個論壇得到了代碼現在,對我來說工作得很好:

 
SELECT 
    tab.* 
FROM 
    t33 tab 
    INNER JOIN (
    SELECT 
     m1.y, 
     m1.factor1, 
     m1.min_1, 
     m2.min_2 
    FROM 
     (
     SELECT 
      y, 
      factor1, 
      MIN(number1) AS min_1 
     FROM 
      t33 tab 
     GROUP BY 
      y, 
      factor1 
    ) m1 
     INNER JOIN (
     SELECT 
       y, 
       factor1, 
       number1, 
       MIN(number2) AS min_2 
      FROM 
       t33 
      GROUP BY 
       y, 
       factor1, 
       number1 
     ) m2 
     ON m1.y = m2.y 
     AND m1.factor1 = m2.factor1 
     AND m1.min_1 = m2.number1 
    ) sel 
     ON tab.y = sel.y 
     AND tab.factor1 = sel.factor1 
     AND tab.number1 = sel.min_1 
     AND tab.number2 = sel.min_2 
1
SELECT id , year, number1, number2 
FROM @table A 
WHERE number1 IN (SELECT MIN(number1) FROM @table WHERE year = A.year) 
OR number2 IN (SELECT MIN(number2) FROM @table WHERE year = A.year) 

其中@table是你的表

+0

結果是1,2,3,5,6,8,因爲2包含Number1 = 1,它是2010年的MIN(Number1) – Zyku 2012-03-29 12:44:48

+0

查詢很好,但是您可以刪除那些括號嗎?在oracle中你沒有這樣的東西。 – 2012-03-29 12:46:22

+0

sigur,沒問題 – Zyku 2012-03-29 12:47:32

0

好了,這樣的事情?

delete from mb_test 
where ID not in 
    (select id 
    from mb_test mbt 
     ,(select year, min(number1) as min1, min(number2) as min2 
      from mb_test 
      group by year) mb_mins 
    where mbt.year = mb_mins.year 
    and (mbt.number1 = mb_mins.min1 OR mbt.number2 = mb_mins.min2) 
    )