2016-05-17 43 views
0

我有一个包含三个日期列和一些资产信息的表。比较SQL Server中3列之间的日期值并在SQL Server中提取资产信息

  • ASSET(APPR_DATE_1,APPR_DATE_2,APPR_DATE_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年的资产信息。

  3. 2点不应包括已经包含在第1点

山口ID是唯一的资产。这在SQL中可能吗?

+0

是的,这是可能的。但为了帮助我们,请提供样本数据和预期结果,帮助我们理解您的问题。 –

+0

你需要从某件事开始。因此,从'SELECT * FROM ASSET'开始。接下来尝试'SELECT *,DATEDIFF(y,APPR_DATE_1,APPR_DATE_2)作为Diff1 FROM ASSET'。你有什么想法如何建立它?这只是一堆基于'DATEDIFF'结果的布尔逻辑。乏味的部分是,如果三个日期是随机的顺序,你需要尝试每一种组合。 –

+0

或者您可以从一些逻辑开始,对日期进行一致排序并建立在以下基础上:'SELECT CASE当APPR_DATE_1> APPR_DATE_2和APPR_DATE_1> APPR_DATE_3 THEN APPR_DATE_1当APPR_DATE_2> APPR_DATE_1和APPR_DATE_2> APPR_DATE_3然后APPR_DATE_2 ELSE APPR_DATE_3从资产END D1# –

回答

1

使用CASE表达式来确定最近的,第二个和最早的日期。把它们放在一个CTEWHERE子句中使用的列名

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 

ONLINE DEMO

1

查询似乎很忙,但它应该为你工作。

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