1

これが私のORACLEテーブルです

HAVE******
asset_no, sub,          add_dtm
11510     FOX HOLLOW    8/1/2008 8:00:01 AM
11510     FOX HOLLOW    11/1/2011 1:30:01 PM
11510     FOX HOLLOW    10/1/2012 8:00:01 AM
11511     TOWNE NORTH   6/25/2008 5:23:15 PM
11512     EAST SUB      7/23/2010 2:50:44 PM

WANT******
11510     FOX HOLLOW    10/1/2012 8:00:01 AM
11511     TOWNE NORTH   6/25/2008 5:23:15 PM
11512     EAST SUB      7/23/2010 2:50:44 PM    

上記(11510)のようにテーブルに重複したasset_noがあり、日付が異なります。重複したasset_noごとに最大日付が必要です。select asset_no, max(add_dtm) を実行すると、必要なものが得られますが、「sub」フィールドも必要です。asset_no、sub、max(add_dtm) を選択すると、上記の結果が得られます。

4

3 に答える 3

3

これを行うにはいくつかの方法があります - SQL Fiddle with Demo of all queriesを参照してください

サブクエリを使用できます。

select t1.asset_no,
  t1.sub,
  t1.add_dtm
from table1 t1
inner join
(
  select max(add_dtm) mxdate, asset_no
  from table1
  group by asset_no
) t2
  on t1.add_dtm = t2.mxdate
  and t1.asset_no = t2.asset_no

CTEまたは、次を使用して使用できますrow_number()

with cte as
(
  select asset_no,
    sub,
    add_dtm,
    row_number() over(partition by asset_no 
                      order by add_dtm desc) rn
  from table1
) 
select *
from cte
where rn = 1

またはCTEを使用せずにrow_number()

select *
from 
(
  select asset_no,
    sub,
    add_dtm,
    row_number() over(partition by asset_no 
                      order by add_dtm desc) rn
  from table1
) x
where rn = 1
于 2012-10-02T21:58:45.150 に答える
2

おそらく最も簡単な方法は、次のような分析 (別名ウィンドウ) 関数を使用することです。

SELECT *
FROM (
    SELECT 
        YOUR_TABLE.*, 
        RANK() OVER (PARTITION BY asset_no ORDER BY add_dtm DESC) R
    FROM YOUR_TABLE
)
WHERE R = 1

複数の等しい最大日付がある場合 (同じ に対して)、これは複数の行を返すことに注意してくださいasset_no。それらの 1 つだけを (ランダムに) 選択するには、 を使用できますROW_NUMBER() OVER ...


または、昔ながらの方法で行います。

SELECT *
FROM YOUR_TABLE T1
WHERE
    add_dtm = (
        SELECT MAX(add_dtm)
        FROM YOUR_TABLE T2
        WHERE T1.asset_no = T2.asset_no
    );

これは、(Oracle とは異なり) 分析関数をサポートしていない DBMS でも機能します。

[SQLフィドル]

于 2012-10-02T22:29:00.947 に答える
0

これを試して

WITH CTE AS
(
SELECT asset_no, sub,add_dtm, 
row_number() over (partition by asset_no, sub order by add_dttm desc) 
rn from table1
)

select * from cte where rn = 1;
于 2012-10-02T22:00:44.073 に答える