我想按日期获取客户的最新电话号码。同一客户有多个条目。但除此之外,我只想要具有最大日期的记录。
样本数据
|cust_id | phone | hist_date
| A | 1234 | 2015-10-02
| A | 4567 | 2016-10-02
| A | 7896 | 2017-10-02
| B | 6456 | 2015-10-02
| B | 8621 | 2016-10-02
| B | 6382 | 2017-10-02
| A | 1393 | 2018-10-02
所需结果为
|cust_id | phone | hist_date
| A | 1393 | 2018-10-02
| B | 6382 | 2017-10-02
请不要对年份进行硬编码。我需要它是动态的,以便每次仅显示最新的日期记录。我知道可以通过使用行号的子查询和CTE来实现。我尝试过,但是没有正确。非常感谢您的帮助。
答案 0 :(得分:2)
使用row_number()
分析函数
select * from
(select *,row_number()over(partition by cust_id order by hist_date desc) rn
from logic
) t where t.rn=1
或者您可以使用corelate子查询
select t1.* from logic t1
where t1.hist_date=( select max(hist_date)
from logic t2 where t1.cust_id=t2.cust_id
)
答案 1 :(得分:1)
使用row_number()
窗口功能
select * from
(
select *, row_number() over(partition by cus_id order by hist_date desc) as rn
from logic
)A where rn=1
答案 2 :(得分:0)
您也可以尝试以下查询。
create table temp(cust_id char(1), phone char(5), hist_date date)
insert into temp values
('A', '1234', '2015-10-02'),
('A', '4567', '2016-10-02'),
('A', '7896', '2017-10-02'),
('B', '6456', '2015-10-02'),
('B', '8621', '2016-10-02'),
('B', '6382', '2017-10-02'),
('A', '1393', '2018-10-02')
现在是实际查询。
Select a.* from temp a
inner join (
Select cust_id, MAX(hist_date) as hist_date from temp
group by cust_id
)b on a.cust_id = b.cust_id and a.hist_date = b.hist_date