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 的最大日期。当我选择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),这将返回多行。要仅选择其中一个(随机),您可以使用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
    );

这甚至适用于不支持分析功能的 DBMS(与 Oracle 不同)。

[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 回答