Sql 查找每个帐户的最新合同

Sql 查找每个帐户的最新合同,sql,oracle,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 我想得出2017年4月20日123456的值,2018年2月5日987654的值

我正在寻找一个帐户的最新条目,并且只提取该帐户的值。我正在使用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
我想得出2017年4月20日123456的值,2018年2月5日987654的值,以及2018年4月27日456789的值


感谢您的帮助

使用
行号

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给出的现在已删除的答案就足够了。如果我们还需要该值,或者通常需要每个记录中的其他列,那么我们必须进行额外的连接,或者像我前面所做的那样使用行编号


请参阅。

使用
行号

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给出的现在已删除的答案就足够了。如果我们还需要该值,或者通常需要每个记录中的其他列,那么我们必须进行额外的连接,或者像我前面所做的那样使用行编号


请参阅。

作为Tim答案的替代方案,另一个选项是使用聚合函数和或
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)。

作为Tim回答的替代方案,另一种选择是使用聚合函数和或
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)。

@cdaiga感谢您的编辑,尽管我不知道我们是否需要避开
date
value
。这正是我想要的。谢谢大家!@cdaiga感谢您的编辑,尽管我不知道我们是否需要转义
日期
。这正是我要找的。非常感谢。