Sql server 返回指定日期列之间的行
我想要的结果是:Sql server 返回指定日期列之间的行,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我想要的结果是: MatchDate ColA ColB PossibleDate 01/01/2012 ABC 123 01/01/2012 01/01/2012 ABC 123 09/01/2012 01/01/2012 ABC 123 01/15/2013 09/01/2012 ABC 123 01/01/2012 09/01/2012 ABC 123 09/01/2012 09/01
MatchDate ColA ColB PossibleDate
01/01/2012 ABC 123 01/01/2012
01/01/2012 ABC 123 09/01/2012
01/01/2012 ABC 123 01/15/2013
09/01/2012 ABC 123 01/01/2012
09/01/2012 ABC 123 09/01/2012
09/01/2012 ABC 123 09/13/2012
09/01/2012 ABC 123 10/11/2012
09/01/2012 ABC 123 01/15/2013
01/15/2013 ABC 123 01/01/2012
01/15/2013 ABC 123 09/01/2012
01/15/2013 ABC 123 01/15/2013
01/15/2013 ABC 123 02/22/2013
08/15/2012 XYZ 777 08/15/2012
08/15/2012 XYZ 777 08/28/2012
08/15/2012 XYZ 777 10/11/2012
08/15/2012 XYZ 777 01/15/2013
01/15/2013 XYZ 777 01/15/2013
01/15/2013 XYZ 777 08/15/2012
它应该返回每个唯一的MatchDate、ColA和ColB列的行,以及介于MatchDate和PossibleDate之间的任何可能的日期
我添加了注释来解释为什么每一列都有效,为什么不有效:
MatchDate ColA ColB PossibleDate
01/01/2012 ABC 123 NULL
09/01/2012 ABC 123 09/13/2012
09/01/2012 ABC 123 10/11/2012
01/15/2013 ABC 123 02/22/2013
08/15/2012 XYZ 777 08/28/2012
08/15/2012 XYZ 777 10/11/2012
01/15/2013 XYZ 777 NULL
提前谢谢…希望不要太混乱。不确定我是否理解所有内容,请尝试一下
除了开玩笑和阿斯匹林,我想你必须更清楚地解释你的搜索协议才能得到任何帮助,否则我怀疑你可能会冒险把问题结束……我已经试过几次来解开你的问题,但我只是没有达到目的……抱歉:对不起,我试图解释为什么每一列都是有效的。基本上,对于给定的组,我需要两个特定日期之间的所有行。问题是它需要比较的日期可能在下一行。呃……任何时候你开始查看SQL数据集,然后讨论下一行可能是什么,你只是让编写查询变得非常不愉快。希望其他人能帮助你,因为我不够聪明,无法从你列出的结果中推断出你的一般规则。谢谢你的努力,对不起,我帮不了你。这很有效。很抱歉,范围太窄,但我相信其他人可以使用此功能。
MatchDate ColA ColB PossibleDate (Notes)
01/01/2012 ABC 123 01/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
01/01/2012 ABC 123 09/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
01/01/2012 ABC 123 01/15/2013 (Not valid as it's MatchDate already exists for "ABC, 123")
09/01/2012 ABC 123 01/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
09/01/2012 ABC 123 09/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
09/01/2012 ABC 123 09/13/2012 (VALID as it's PossibleDate is NOT a MatchDate and it's between 09/01/2012 and the next possible MatchDate of 01/15/2013 for "ABC, 123")
09/01/2012 ABC 123 10/11/2012 (VALID as it's PossibleDate is NOT a MatchDate and it's between 09/01/2012 and the next possible MatchDate of 01/15/2013 for "ABC, 123")
09/01/2012 ABC 123 01/15/2013 (Not valid as it's MatchDate already exists for "ABC, 123")
01/15/2013 ABC 123 01/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
01/15/2013 ABC 123 09/01/2012 (Not valid as it's MatchDate already exists for "ABC, 123")
01/15/2013 ABC 123 01/15/2013 (Not valid as it's MatchDate already exists for "ABC, 123")
01/15/2013 ABC 123 02/22/2013 (VALID as it's PossibleDate is NOT a MatchDate and it's between 01/15/2013 and the next possible MatchDate, which doesn't exist as it's the largest MatchDate for "ABC, 123")
08/15/2012 XYZ 777 08/15/2012 (Not valid as it's MatchDate already exists for "XYZ, 777")
08/15/2012 XYZ 777 08/28/2012 (VALID as it's PossibleDate is NOT a MatchDate and it's between 08/15/2012 and the next possible MatchDate of 01/15/2013 for "XYZ, 777")
08/15/2012 XYZ 777 10/11/2012 (VALID as it's PossibleDate is NOT a MatchDate and it's between 08/15/2012 and the next possible MatchDate of 01/15/2013 for "XYZ, 777")
08/15/2012 XYZ 777 01/15/2013 (Not valid as it's MatchDate already exists for "XYZ, 777")
01/15/2013 XYZ 777 01/15/2013 (Not valid as it's MatchDate already exists for "XYZ, 777")
01/15/2013 XYZ 777 08/15/2012 (VALID as it's PossibleDate is NOT a MatchDate and it's between 01/15/2013 and the next possible MatchDate, which doesn't exist as it's the largest MatchDate for "XYZ, 777")
WITH cte AS
(SELECT *,
NexMatchDate = ISNULL(
(SELECT MIN(MatchDate)
FROM t t2
WHERE t2.MatchDate > t.MatchDate
AND t2.ColA = t.ColA AND t2.ColB = t.ColB)
,'99991231')
FROM t
)
, datelist AS
(SELECT DISTINCT MatchDate, ColA, ColB
FROM t
)
SELECT d.MatchDate, d.ColA, d.ColB, c.PossibleDate
from datelist d
LEFT JOIN cte c
ON d.MatchDate = c.MatchDate
AND d.ColA = c.ColA
AND d.ColB = c.ColB
AND c.PossibleDate > c.MatchDate AND c.PossibleDate < c.NexMatchDate
ORDER BY 1,2,3