2012-01-17 92 views
18

假设我提取了一些数据集。Oracle:以最大日期记录

SELECT A, date 
FROM table 

我只想用最大日期(A的每个值)的记录。我可以写

SELECT A, col_date 
    FROM TABLENAME t_ext 
WHERE col_date = (SELECT MAX (col_date) 
        FROM TABLENAME t_in 
        WHERE t_in.A = t_ext.A) 

但我的查询是很长...有使用分析函数做同样的一个最简洁的方式?

回答

39

的解析函数的做法会看起来像

SELECT a, some_date_column 
    FROM (SELECT a, 
       some_date_column, 
       rank() over (partition by a order by some_date_column desc) rnk 
      FROM tablename) 
WHERE rnk = 1 

请注意,这取决于你想如何处理关系(或关系无论是在你的数据模型是可能的),你可能希望使用无论是ROW_NUMBERDENSE_RANK解析函数,而不是RANK

+0

你是什么意思与关系? – Revious 2012-01-18 13:37:45

+1

@ Gik25 - 如果在TABLENAME中有两行具有相同的A值和SOME_DATE_COLUMN相同的值,那么就会发生联系。你原来的查询会返回这两行,就像我的。另一方面,如果您使用'ROW_NUMBER'函数,则只返回两行中的一行(尽管选择返回哪一行将是任意的)。 – 2012-01-18 14:45:01

15

如果datecol_date是相同的列,你应该简单地做:

SELECT A, MAX(date) FROM t GROUP BY A 

为什么不使用:

WITH x AS (SELECT A, MAX(col_date) m FROM TABLENAME) 
SELECT A, date FROM TABLENAME t JOIN x ON x.A = t.A AND x.m = t.col_date 

否则:

SELECT A, FIRST_VALUE(date) KEEP(dense_rank FIRST ORDER BY col_date DESC) 
    FROM TABLENAME 
GROUP BY A 
+1

+1第一个SQL是最简单也是最好的答案 – 2012-01-17 16:38:15

+1

@Matt:是的,但只有当OP只需要这两列而不是整行(因为它在问题中被暗示)。 – 2012-01-17 16:39:12

+0

@ypercube我同意,这就是问题的样子 – 2012-01-17 16:41:50

6

您还可以使用:

SELECT t.* 
    FROM 
     TABLENAME t 
    JOIN 
     (SELECT A, MAX(col_date) AS col_date 
      FROM TABLENAME 
      GROUP BY A 
     ) m 
     ON m.A = t.A 
     AND m.col_date = t.col_date 
+1

如果有'(a,col_date)'上的索引,这将是一个不错的选择,特别是如果A的每个不同值有很多日期。 – APC 2012-01-17 18:17:18

+0

这适用于我。 – GunWanderer 2017-03-13 20:00:54

-3
SELECT mu_file, mudate 
    FROM flightdata t_ext 
WHERE mudate = (SELECT MAX (mudate) 
        FROM flightdata where mudate < sysdate) 
+0

这看起来不符合问题吗? – 2015-06-26 02:24:12

1

贾斯汀洞的回答是最好的,但如果你想antoher选项,试试这个:

select A,col_date 
from (select A,col_date 
    from tablename 
     order by col_date desc) 
     where rownum<2 
+1

非常感谢 – 2017-09-27 04:52:32

1

A是关键,MAX(日期)是价值,我们可能会简化查询如下:

SELECT distinct A,max(date)over(partition by A) FROM TABLENAME