Sql 查找每个帐户的最新合同
我正在寻找一个帐户的最新条目,并且只提取该帐户的值。我正在使用oracle数据库。以下是一个例子: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的值
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感谢您的编辑,尽管我不知道我们是否需要转义日期
和值
。这正是我要找的。非常感谢。