2012-01-17 94 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