查找每个帐户的最新合同

时间:2018-04-27 15:26:34

标签: sql oracle

我希望找到帐户的最新条目,并且只为该帐户提取该值。我正在使用oracle数据库。这是一个例子:

account date    value
123456  4/20/2017   5
123456  1/20/2017   10
987654  2/5/2018    15
987654  12/31/2017  20
456789  4/27/2018   50
456789  1/24/2018   60

我想提取12月4日的4月20日值,987654的2/5/2018值和456789的4/27/2018值。

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

使用ROW_NUMBER

SELECT account, "date", "value"
FROM
(SELECT 
  account, "date", "value",
  ROW_NUMBER() OVER (PARTITION BY account ORDER BY "date" DESC) rn
 FROM yourTable
) t
WHERE rn=1;

请注意,如果我们只想要每个帐户的最大日期,那么@NiVeR给出的现在删除的答案就足够了。如果我们还需要值,或者通常需要每个记录中的其他列,那么我们必须进行额外的连接,或者使用上面的行号。

请参阅Demo on SQL Fiddle

答案 1 :(得分:1)

作为Tim答案的替代方案,另一种选择是使用keep (dense_rank first ...)last的聚合函数:

select account, max(date_col) as max_date,
  max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;

与您在CTE中提供的样本数据(以及将数据列名称更改为有效内容)相同,结果如下:

with your_table (account, date_col, value) as (
            select 123456, date '2017-04-20', 5 from dual
  union all select 123456, date '2017-01-20', 10 from dual
  union all select 987654, date '2018-02-05', 15 from dual
  union all select 987654, date '2017-12-31', 20 from dual
  union all select 456789, date '2018-04-27', 50 from dual
  union all select 456789, date '2018-01-24', 60 from dual
)
select account, max(date_col) as max_date,
  max(value) keep (dense_rank last order by date_col) as value_from_max_date
from your_table
group by account;

   ACCOUNT MAX_DATE   VALUE_FROM_MAX_DATE
---------- ---------- -------------------
    123456 2017-04-20                   5
    456789 2018-04-27                  50
    987654 2018-02-05                  15

如果要从该目标行中包含大量列,那么这会变得混乱,而另一种方法则更简单;但从某些方面来说,这种情况更为明确(IMO)。