为MAX() SQL SERVER- Row_number()挑选各自的serviceID



我需要指导我正在研究的一个问题,我以前没有解决它的经验。

基本上,这就是数据的样子:

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

相关内容

最新更新