2016-05-29 48 views
2

舊的價值觀我有這樣如何獲得partitoned每個組

ID | Type | Val0 | Creation_date 
1 | A | V1 | 24sep, 2011 
2 | B | X1 | 15 dec, 2001 
3 | A | V1 | 27oct, 2008 
4 | A | V2 | 19oct, 2003 
5 | B | X2 | 15 dec, 2000 
6 | C | X3 | 23Dec, 2001 
7 | B | X2 | 15 dec, 1990 

表我只想保留最新值特定類型,並提取出哪些是舊值。所以,對於上面的表格,我想要將這些項目提取出來 - V2,X2,我可以稍後再刪除它們。

由於A具有最新值作爲V1,因此B具有最新值作爲X1並且C具有最新值作爲X3。

有人可以建議我如何使用SQL做到這一點?

回答

0

如果你只是想要的值,你可以使用keep

select type, 
     max(val0) keep (dense_rank first order by creation_date asc) as latest_val0 
from t 
group by type; 

如果你想整行,然後使用row_number()

select t.* 
from (select t.*, 
      row_number() over (partition by type order by creation_date asc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

我不想最新values.I希望前輩值.. – Neha

+0

此查詢將不會爲他工作。 – sagi

+0

@Neha。 。 。如果你想要最老的值,只需使用'asc'而不是'desc'。 –

0

甲骨文設置

CREATE TABLE table_name (ID, Type, Val, Creation_date) AS 
SELECT 1, 'A', 'V1', DATE '2011-09-24' FROM DUAL UNION ALL 
SELECT 2, 'B', 'X1', DATE '2001-12-15' FROM DUAL UNION ALL 
SELECT 3, 'A', 'V1', DATE '2008-10-27' FROM DUAL UNION ALL 
SELECT 4, 'A', 'V2', DATE '2003-10-19' FROM DUAL UNION ALL 
SELECT 5, 'B', 'X2', DATE '2000-12-15' FROM DUAL UNION ALL 
SELECT 6, 'C', 'X3', DATE '2001-12-23' FROM DUAL UNION ALL 
SELECT 7, 'B', 'X2', DATE '1990-12-15' FROM DUAL; 

查詢

SELECT ID, 
     TYPE, 
     val, 
     Creation_date 
FROM (
    SELECT t.*, 
     LAST_VALUE(val) OVER (
      PARTITION BY type 
      ORDER BY creation_date 
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
     ) AS last_val 
    FROM table_name t 
) 
WHERE val <> last_val; 

輸出

 ID TYPE VAL CREATION_DATE  
---------- ---- --- ------------------- 
     4 A V2 2003-10-19 00:00:00 
     7 B X2 1990-12-15 00:00:00 
     5 B X2 2000-12-15 00:00:00 
相關問題