我在oracle db中检索一个大组最大值的行时遇到问题。
我的表看起来像这样:
id,col1,col2,col3,col4,col5,date_col
该组将由4列col1,col2,col3,col4组成,因此该组的成员mof应该在这些字段上相等,并且从每个组中我需要行(id足够)以及最大date_col值(可以是几个相同的日期)。
它应该以某种方式解决,或者可能有更好的方法吗?
感谢您的提示!
干杯
答案 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
)分析函数查找组中的最大值:
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;
试用这个解决方案