2012-03-29 50 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) 
    )