按日期获取客户的最新记录

时间:2019-02-26 10:46:19

标签: sql sql-server

我想按日期获取客户的最新电话号码。同一客户有多个条目。但除此之外,我只想要具有最大日期的记录。

样本数据

|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来实现。我尝试过,但是没有正确。非常感谢您的帮助。

3 个答案:

答案 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

Live Demo