2017-01-29 83 views
3

我有一個包含月份和年份的多列的表格。我試圖根據第1欄第2欄來確定最大的月份和年份。基於兩列的最大值

我有一個測試表的DDL本身。

CREATE TABLE "TEST" 
    ( "COLUMN1" VARCHAR2(6 BYTE), 
    "COLUMN2" VARCHAR2(6 BYTE), 
    "YEAR" NUMBER, 
    "MONTH" NUMBER 
    ); 

這是示例表中的數據。

REM INSERTING into TEST 
SET DEFINE OFF; 
Insert into TEST (COLUMN1,COLUMN2,YEAR,MONTH) values ('A','A',11,4); 
Insert into TEST (COLUMN1,COLUMN2,YEAR,MONTH) values ('A','A',14,3); 
Insert into TEST (COLUMN1,COLUMN2,YEAR,MONTH) values ('A','A',11,5); 
Insert into TEST (COLUMN1,COLUMN2,YEAR,MONTH) values ('A','A',14,1); 

我想獲得最大月份和年份的記錄。當我嘗試檢索記錄使用此查詢

SELECT t.COLUMN1, t.COLUMN2, max(t.YEAR), max(t.MONTH) 
FROM TEST t 
group by COLUMN1, COLUMN2; 

我得到這個結果

enter image description here

在我看來,它是分離的最大年最大月獨立於其他列。 預期結果應該是 enter image description here

我該如何找到合適的結果? 我已經嘗試了幾個自我加入無濟於事。

+0

請問爲什麼您將月份和年份存儲在單獨的列中? –

+0

@Tim ERP解決方案,不是我的設計 – Miguel

回答

3

您要使用Oracle的內置LAST(或FIRST)與MAX這樣的:

SELECT t.COLUMN1, 
    t.COLUMN2, 
    MAX(t.YEAR), 
    MAX(t.MONTH) keep (dense_rank last ORDER BY YEAR nulls first) MONTH 
FROM TEST t 
GROUP BY COLUMN1, 
    COLUMN2; 

它會找到每月僅最近一年最大。

+0

謝謝我的朋友,這很棒。 – Miguel

+2

@Miguel - 通常「第一個」MAX(如本例中的MAX一樣)是唯一的,並且使用具有FIRST/LAST功能的MAX(...)並不是真的需要 - 它從一個只有一個值的集合中提取'MAX',然而Oracle在解析時無法知道(沒有看到所有的數據),所以它仍然需要一個聚合函數(在這個例子中是月)。例子是'FIRST/LAST'的**完全**功能的一個很好的例子,其中''用於'保持(dense_rank first/last order by ...)'的'MAX'實際上被充分利用。 – mathguy

+0

@mathguy謝謝作爲解釋,這對我來說也是非常令人大開眼界的。 – Miguel

0

你也可以以某種方式連接兩個值,計算最大值,然後拆分它們。在年和月的情況下,您可以計算自某個時期以來的月份:

select column1, column2, 
     trunc(max(year*12+month-1)/12) year, 
     mod (max(year*12+month-1),12)+1 month 
    from test 
group by column1, column2