从组中选择具有最大值的行

时间:2015-11-13 12:36:54

标签: sql oracle

我在oracle db中检索一个大组最大值的行时遇到问题。

我的表看起来像这样:

id,col1,col2,col3,col4,col5,date_col

该组将由4列col1,col2,col3,col4组成,因此该组的成员mof应该在这些字段上相等,并且从每个组中我需要行(id足够)以及最大date_col值(可以是几个相同的日期)。

它应该以某种方式解决,或者可能有更好的方法吗?

感谢您的提示!

干杯

5 个答案:

答案 0 :(得分:2)

我认为您需要使用row_number()进行条件聚合:

select t.*
from (select t.*,
             row_number() over (partition by col1, col2, col3, col4 order by date_col desc) as seqnum
      from t
     ) t
where seqnum = 1;

如果您希望所有行都具有最大值,请改用dense_rank()rank()

您还可以使用keep使用聚合获取col5的值:

select col1, col2, col3, col4,
       max(col5) keep (dense_rank first order by date_col desc) as col5,
       max(date_col) as date_col
from t
group by col1, col2, col3, col4;

但是,这只返回一个值。

答案 1 :(得分:2)

您可以使用RANK(或DENSE_RANK)分析函数查找组中的最大值:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( id, col1, col2, col3, col4, col5, date_col ) AS
          SELECT  1, 1, 1, 1, 1, 1, DATE '2015-11-13' FROM DUAL
UNION ALL SELECT  2, 1, 1, 1, 1, 2, DATE '2015-11-12' FROM DUAL
UNION ALL SELECT  3, 1, 1, 1, 1, 3, DATE '2015-11-11' FROM DUAL
UNION ALL SELECT  4, 1, 1, 1, 1, 4, DATE '2015-11-13' FROM DUAL
UNION ALL SELECT  5, 1, 1, 1, 1, 5, DATE '2015-11-12' FROM DUAL
UNION ALL SELECT  5, 1, 1, 1, 1, 5, DATE '2015-11-12' FROM DUAL
UNION ALL SELECT  6, 1, 1, 1, 2, 1, DATE '2015-11-12' FROM DUAL
UNION ALL SELECT  7, 1, 1, 1, 2, 2, DATE '2015-11-13' FROM DUAL
UNION ALL SELECT  8, 1, 1, 1, 2, 3, DATE '2015-11-11' FROM DUAL
UNION ALL SELECT  9, 1, 1, 1, 2, 4, DATE '2015-11-12' FROM DUAL
UNION ALL SELECT 10, 1, 1, 1, 2, 5, DATE '2015-11-13' FROM DUAL

查询1

SELECT *
FROM   (
  SELECT t.*,
         RANK() OVER ( PARTITION BY col1, col2, col3, col4 ORDER BY date_col DESC ) AS rnk
  FROM   table_name t
)
WHERE  rnk = 1

<强> Results

| ID | COL1 | COL2 | COL3 | COL4 | COL5 |                   DATE_COL | RNK |
|----|------|------|------|------|------|----------------------------|-----|
|  1 |    1 |    1 |    1 |    1 |    1 | November, 13 2015 00:00:00 |   1 |
|  4 |    1 |    1 |    1 |    1 |    4 | November, 13 2015 00:00:00 |   1 |
|  7 |    1 |    1 |    1 |    2 |    2 | November, 13 2015 00:00:00 |   1 |
| 10 |    1 |    1 |    1 |    2 |    5 | November, 13 2015 00:00:00 |   1 |

答案 2 :(得分:0)

怎么样:

SELECT MAX(ColumnName) FROM Dual;

编辑:
我认为你必须使用视图来获得你想要的东西。
我没有机会来测试这段代码,但我认为你需要这样的东西:

-- ViewA
SELECT  NULL Id, Col1, Col2, Col3, Col4, Col5, MAX(DateCol) 
FROM    TableA 
GROUP BY Col1, Col2, Col3, Col4, Col5

-- ViewB
SELECT  Id, Col1, Col2, Col3, Col4, Col5, DateCol 
FROM    TableA 

-- ViewC
SELECT  NVL(A.Id, B.Id) Id,
    A.Col1, 
        A.Col2, 
        A.Col3, 
        A.Col4, 
        A.Col5,
        A.DateCol
FROM    ViewA A, ViewB B 
AND     A.Col1 = B.Col1
AND A.Col2 = B.Col2 
AND A.Col3 = B.Col3
AND     A.Col4 = B.Col4; 

答案 3 :(得分:0)

这就是你要找的..........

SELECT col1, col2, col3, col4, MAX(date_col), Count(id)
FROM YOUR_TABLE
WHERE 1=1
  AND any other condition
GROUP BY
  col1, col2, col3, col4

答案 4 :(得分:-1)

select T.id
  from table_name T
 where date_col = (select max(date_col) 
                     from table_name 
                    where col1 = T.col1)
group by col1;

试用这个解决方案