基于日期SQL删除旧记录

基于日期SQL删除旧记录,sql,sql-server,tsql,duplicates,Sql,Sql Server,Tsql,Duplicates,这是我的问题 SELECT cf.CLIENTID, p.Id as ProfileID, t.TITLEDESC as Title, cf.ClntForenme as Name, cf.CLNTSURNME as Surname, pm.Lender, pm.Product, pm.LenderReference, pm.AmountRequested as LoanAmount, pm.DateCompleted, CASE

这是我的问题

SELECT 
    cf.CLIENTID, p.Id as ProfileID, t.TITLEDESC as Title,
    cf.ClntForenme as Name, cf.CLNTSURNME as Surname, 
    pm.Lender, pm.Product, pm.LenderReference,
    pm.AmountRequested as LoanAmount,
    pm.DateCompleted, 
    CASE 
       WHEN pm.DateCompleted BETWEEN (SELECT DATEADD(YEAR, -1, GETDATE())) AND GETDATE() 
          THEN 'Completed under a year ago'
       WHEN pm.DateCompleted BETWEEN (SELECT DATEADD(YEAR, -2, GETDATE())) AND (SELECT DATEADD(YEAR, -1, GETDATE())) 
          THEN 'Backlog WOM 1 Year'
       WHEN pm.DateCompleted BETWEEN (SELECT DATEADD(YEAR, -3, GETDATE())) AND (SELECT DATEADD(YEAR, -2, GETDATE())) 
          THEN 'Backlog WOM 2 Year'
       WHEN pm.DateCompleted BETWEEN (SELECT DATEADD(YEAR, -4, GETDATE())) AND (SELECT DATEADD(YEAR, -3, GETDATE())) 
          THEN 'Backlog WOM 3 Year'
       ELSE ''
    END Source,
    CASE 
       WHEN pm.Id > 0 THEN 'Check Perspectiove for ERC'
       ELSE ''
    END ERC,
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ID
FROM 
    tbl_Profile as p
INNER JOIN 
    tbl_Profile_Mortgage as pm ON p.id = pm.FK_ProfileId
LEFT JOIN 
    tbl_ClientFile as cf ON p.ClientId = cf.CLIENTID
LEFT JOIN 
    [dbo].tbl_DDTitles as t ON cf.CLNTTITLE = t.titleid
WHERE 
    pm.MortgageStatus = 7 
    AND p.CaseTypeId = 1
    AND pm.DateCompleted BETWEEN (SELECT DATEADD(YEAR, -4, GETDATE())) AND GETDATE()
此查询返回990条记录

有些客户端将有多个配置文件(
ProfileID
),我只想显示最新的
DateCompleted
ProfileID

例如,我有一个客户端ID 5566,这个客户端有3个配置文件,每个配置文件都有自己的Datecompleted,我只想查看基于Datecompleted的最后配置文件信息

任何帮助都将不胜感激


干杯

您的一个选择是按
客户机
配置文件
对数据进行分区,然后检查哪个
日期完成
的值最大(即
日期秩
为1的值)。然后只选择那些值为1的

select * from
(
    SELECT cf.CLIENTID ,p.Id as ProfileID,t.TITLEDESC as Title,cf.ClntForenme as Name,cf.CLNTSURNME as Surname,pm.Lender,pm.Product,pm.LenderReference,pm.AmountRequested as LoanAmount,
    pm.DateCompleted, 
     CASE 
    WHEN pm.DateCompleted BETWEEN (select dateadd(year, -1, getdate())) AND getdate() THEN 'Compelted Under a year ago'
    WHEN pm.DateCompleted BETWEEN (select dateadd(year, -2, getdate())) AND (select dateadd(year, -1, getdate())) THEN 'Backlog WOM 1 Year'
    WHEN pm.DateCompleted BETWEEN (select dateadd(year, -3, getdate())) AND (select dateadd(year, -2, getdate())) THEN 'Backlog WOM 2 Year'
    WHEN pm.DateCompleted BETWEEN (select dateadd(year, -4, getdate())) AND (select dateadd(year, -3, getdate())) THEN 'Backlog WOM 3 Year'
    ELSE ''
    END Source,
    CASE 
    WHEN pm.Id > 0 THEN 'Check Perspectiove for ERC'
    ELSE ''
    END ERC,
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ID,
    ROW_NUMBER() OVER (Partition by CLIENTID, ProfileID order by DateCompleted desc) as DateRank --Changes here
    FROM tbl_Profile as p
    INNER JOIN tbl_Profile_Mortgage as pm
    ON p.id = pm.FK_ProfileId
    LEFT JOIN tbl_ClientFile as cf
    ON p.ClientId = cf.CLIENTID
    LEFT JOIN [dbo].tbl_DDTitles as t on cf.CLNTTITLE = t.titleid
    WHERE pm.MortgageStatus = 7 and p.CaseTypeId = 1
    AND pm.DateCompleted between (select dateadd(year, -4, getdate())) AND getdate()
) clientinfo
where clientinfo.DateRank = 1

感谢您提供的宝贵提示:
(选择dateadd(year,-1,getdate())
可以简化为
dateadd(year,-1,getdate())
。将
between
datetime
一起使用通常会导致时间问题。显式比较通常更可取。由于
case
“按顺序计算其条件,并以满足其条件的第一个条件停止”,因此不需要在每个
when
子句中检查两个条件,只需在
when
时检查第一个
。为了避免在使用多个
GetDate()
调用时出现混淆,它有助于捕获单个值,例如
declare@Now as DateTime=GetDate(),并在整个过程中使用该值。