比较SQL Server中3列之间的日期值,并提取SQL Server中的资产信息
我有一个包含三个日期列和一些资产信息的表 资产评估日期1、评估日期2、评估日期3、ID、名称、地址,。。。 样本数据:比较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-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