我希望找到帐户的最新条目,并且只为该帐户提取该值。我正在使用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值。
感谢您的帮助
答案 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给出的现在删除的答案就足够了。如果我们还需要值,或者通常需要每个记录中的其他列,那么我们必须进行额外的连接,或者使用上面的行号。
答案 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)。