我需要指导我正在研究的一个问题,我以前没有解决它的经验。
基本上,这就是数据的样子:
Customer Nr Service ID Months left till service expiry
57833357 149080495 0
57624280 141110847 0
57885974 149080449 0
57885974 149080480 7
57885974 149080499 1
场景:
我试图找出"Months left till service expiry
"列的MAX()
,对于每个Customer Nr
。
要求:
我基本上要寻找的是,在为每个客户Nr选择MAX()时,还为返回MAX(Months left till service expiry)
的列挑选相应的service ID
。
例如,在上面的数据中,customer nr
=57885974在不同的服务ID:s上出现了三次。service ID
=149080480还有7个月到期,这是客户编号:57885974的最大()。
如何使它只取Customer Nr
,服务ID(最多()个月到服务到期)和服务到期前的剩余月?
:
Customer Nr Service ID Months left till service expiry
57833357 149080495 0
57624280 141110847 0
57885974 149080480 7
我的代码现在看起来像这样:
SELECT DISTINCT
Customer_nr,
[Months left till service expiry]=CASE WHEN DATEDIFF(DAY,Date,EndDate) BETWEEN 0 AND 30 THEN '1'
WHEN DATEDIFF(DAY,Date,EndDate) BETWEEN 31 AND 60 THEN '2'
ELSE SOMETHING END
FROM TABLE A
GROUP BY Customer_nr,
serviceID,
CASE WHEN DATEDIFF(DAY,Date,EndDate) BETWEEN 0 AND 30 THEN '1'
WHEN DATEDIFF(DAY,Date,EndDate) BETWEEN 31 AND 60 THEN '2'
ELSE SOMETHING END
在下一个表中,我简单地通过Customer_nr
和MAX([月剩余直到服务到期])做一个组,它的工作。但是,我还需要相应的serviceID
.
我该怎么做呢?
你可以直接使用row_number()
:
select a.*
from (select a.*,
row_number() over (partition by Customer_nr order by [Months left till service expiry] desc) as seqnum
from a
) a
where seqnum = 1;
类似的解决方案可以通过使用Sql CTE表达式来构建在Select查询
中使用SQL Server排序函数和Partition By是这种过滤的主要解决方案。/*
create table tblExp (CustomerNr int, ServiceID int, MonthsForExpiry int)
insert into tblExp select 57833357 ,149080495 ,0
insert into tblExp select 57624280 ,141110847 ,0
insert into tblExp select 57885974 ,149080449 ,0
insert into tblExp select 57885974 ,149080480 ,7
insert into tblExp select 57885974 ,149080499 ,1
*/
;with cte as (
select *,
rn = ROW_NUMBER() OVER (Partition by CustomerNr Order By MonthsForExpiry desc)
from tblExp
)
select * from cte where rn = 1