比较SQL Server中3列之间的日期值,并提取SQL Server中的资产信息

比较SQL Server中3列之间的日期值,并提取SQL Server中的资产信息,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个包含三个日期列和一些资产信息的表 资产评估日期1、评估日期2、评估日期3、ID、名称、地址,。。。 样本数据: '1-1-2010','1-1-2012','1-1-2015',1,'Peter','USA'.... '1-1-2015','1-10-2014','1-19-2013',2,1,'John','USA'.... '1-1-2008','1-25-2010','4-29-2011',3,'Edward','UK'.... '1-25-2012','10-25-2011','

我有一个包含三个日期列和一些资产信息的表

资产评估日期1、评估日期2、评估日期3、ID、名称、地址,。。。 样本数据:

'1-1-2010','1-1-2012','1-1-2015',1,'Peter','USA'....
'1-1-2015','1-10-2014','1-19-2013',2,1,'John','USA'....
'1-1-2008','1-25-2010','4-29-2011',3,'Edward','UK'....
'1-25-2012','10-25-2011','9-11-2013',4,'Nancy','Kenya'....
预期结果:

'1-1-2010','1-1-2012','1-1-2015',1,'Peter','USA'....
'1-1-2008','1-25-2010','4-29-2011',3,'Edward','UK'....
'1-25-2012','10-25-2011','9-11-2013',4,'Nancy','Kenya'....
如果您看到结果集,则它比示例数据少1行。结果集仅包含最近日期和第二个最近日期之间的差值大于365或第二个最近日期和最旧日期之间的差值大于365的行

他们有随机的日期。对于每一行,我需要找到最近的、第二个最近的和最早的日期,一旦我得到了,我需要比较-

列出最近日期与第二个最近日期之差大于1年的资产信息

列出最近第二个日期与最早日期之差大于1年的资产信息

第2点不应包括已经包含在第1点中的资产


colid是唯一的。这在SQL中可能吗?

查询似乎很忙,但它应该适合您

  select * from 
  (
  --then pivot it back to get the columns in order
  select id, 
  [1] as APPR_DATE_1
  ,[2] as APPR_DATE_2
  ,[3] as APPR_DATE_3
  from(
  select id , APPR_DATE ,row_number() over (partition by id order by APPR_DATE asc) as rowid
  from (

  --unpivot first 
  select id , APPR_DATE_1 ,APPR_DATE_2,APPR_DATE_3 from #table
  ) as cp
  unpivot
  (
  APPR_DATE for APPR_DATES in (APPR_DATE_1 ,APPR_DATE_2,APPR_DATE_3)
  ) as up

  ) as x
  pivot
  (
  max(APPR_DATE)
  for 
  rowid in ([1],[2],[3])
  )
  as pv

  )xx
  where  datediff("dd",APPR_DATE_1,APPR_DATE_2)/365 <> 0 or 
  datediff("dd",APPR_DATE_2,APPR_DATE_3)/365 <> 0 
使用用例表达式确定最近、第二和最早的日期。将它们放在CTE中,并使用WHERE子句中的列名


是的,有可能。但为了让我们帮助您,请通过提供样本数据和预期结果来帮助我们理解您的问题。您需要从一些事情开始。因此,从“选择*自资产”开始。下一步尝试从资产中选择*、日期差异、大约日期1、大约日期2作为差异1。你知道如何用它来建造它吗?它只是一组基于DATEDIFF结果的布尔逻辑。令人厌烦的是,如果这三个日期是随机排列的,您需要尝试每一种组合。或者您可以从一些逻辑开始对日期进行一致的排序,并以此为基础:选择案例当APPR_DATE_1>APPR_DATE_2和APPR_DATE_1>APPR_DATE_3>APPR_DATE_2>APPR_DATE_1和APPR_DATE_2>APPR_DATE_3,然后APPR_DATE_3结束D1ASSET@FelixPamittan-嘿,我添加了示例数据。如果你还需要什么,请告诉我。@FelixPamittan-嘿,对不起,我更新了结果。如果您看到结果集,则它比示例数据少1行。结果集仅包含最近日期和第二个最近日期之间的差值大于365或第二个最近日期和最旧日期之间的差值大于365的行
WITH CTE AS(
    SELECT *,
        RecentDate =
            CASE
                WHEN APPR_DATE_1 >= APPR_DATE_2 AND APPR_DATE_1 >= APPR_DATE_3 THEN APPR_DATE_1
                WHEN APPR_DATE_2 >= APPR_DATE_3 AND APPR_DATE_2 >= APPR_DATE_1 THEN APPR_DATE_2
                WHEN APPR_DATE_3 >= APPR_DATE_2 AND APPR_DATE_3 >= APPR_DATE_1 THEN APPR_DATE_3
            END,
        SecondDate =
            CASE
                WHEN APPR_DATE_1 BETWEEN APPR_DATE_2 AND APPR_DATE_3 OR APPR_DATE_1 BETWEEN APPR_DATE_3 AND APPR_DATE_2 THEN APPR_DATE_1
                WHEN APPR_DATE_2 BETWEEN APPR_DATE_1 AND APPR_DATE_3 OR APPR_DATE_1 BETWEEN APPR_DATE_3 AND APPR_DATE_1 THEN APPR_DATE_2
                WHEN APPR_DATE_3 BETWEEN APPR_DATE_1 AND APPR_DATE_2 OR APPR_DATE_1 BETWEEN APPR_DATE_2 AND APPR_DATE_1 THEN APPR_DATE_3
            END,
        OldestDate =
            CASE
                WHEN APPR_DATE_1 <= APPR_DATE_2 AND APPR_DATE_1 <= APPR_DATE_3 THEN APPR_DATE_1
                WHEN APPR_DATE_2 <= APPR_DATE_3 AND APPR_DATE_2 <= APPR_DATE_1 THEN APPR_DATE_2
                WHEN APPR_DATE_3 <= APPR_DATE_2 AND APPR_DATE_3 <= APPR_DATE_1 THEN APPR_DATE_3             
            END
    FROM #ASSET
)
SELECT
    APPR_DATE_1, APPR_DATE_2, APPR_DATE_3, ID, NAME, ADDRESS 
FROM CTE
WHERE
    DATEDIFF(DAY, SecondDate, RecentDate) > 365
    OR DATEDIFF(DAY, OldestDate, SecondDate) > 365