2016-05-29 7 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。 。 。最も古い値が必要な場合は、 'desc'の代わりに' asc'を使用してください。 –

0

Oracleのセットアップ

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