sql 数据连续问题?疑问,欢迎前来回答交流!

0
今天想到个问题想讨论下:
情况如下:有张表(名称定为A)里面包含两个字段(一个是start_date,end_Date),还有一个业务主键就叫(Nid)吧,需要将表中日期不连续的数据删除(连续的概念是:第二行的start_date与第一行的end_Date相差一天,在一条数据中的日期不做比较)。
不知道描述的清楚不?现有示例数据如下:
start_date end_Date
2014/6/30 2014/7/1
2014/7/1 2014/7/2
2014/7/2 2014/7/3
2014/7/3 2014/7/4
2014/7/4 2014/7/7
2014/7/7 2014/7/8
2014/7/8 2014/7/9
2014/7/9 2014/7/10
2014/7/10 2014/7/11
2014/7/11 2014/7/14
2014/7/14 2014/7/15
2014/7/15 2014/7/16
2014/7/16 2014/7/17
2014/7/17 2014/7/18
2014/7/18 2014/7/19
**2014/7/21 2014/7/22
2014/7/22 2014/7/23**

如上数据所示:最终会把加粗的数据去除,
重点是想使用最简便的方法去实现它,目前想到的有CTE,row_number,想问问有没有其它的方法啊!
在此感谢所有查看问题与回答问题的朋友!
已邀请:
0

mjfcq0147 - 渴望金融数据 2014-11-07 回答

各位大神麻烦回答下,求告知啊!
select A1.*
from (
select start_date
,end_date
,Nid
,ROW_NUMBER() over(Partition by Nid order by start_date,end_date) as rowId
from A
) A1
inner join (
select start_date
,end_date
,Nid
,ROW_NUMBER() over(Partition by Nid order by start_date,end_date) as rowId
from A
) A2
on A1.Nid = A2.Nid
and A1.rowId + 1 = A2.rowId
where DATEDIFF(DAY,A1.end_date,A2.start_Date) = 1
0

mjfcq0147 - 渴望金融数据 2014-11-07 回答

各位大神麻烦回答下,求告知啊!
发现示例数据有问题,要把逻辑中的1修改为0,抱歉啊!
with Cte_A as(
select start_date
,end_date
,Nid
from A
)


select Nid
,A1.end_date
,A2.start_date

from Cte_A as A1
left join Cte_A as A2
on A1.Nid = A2.Nid
where DATEDIFF(DAY,A1.End_Dt,A2.Start_Dt) = 1
order by Nid,A1.end_date,A2.start_date


各位大神抽点时间能把想法写下吗?小弟万分感谢啊q
0

梁勇 - 天道酬勤、上善若水。爱好商业智能 2014-11-08 回答

参考下如下方式 【常用SQL分享】求 同一ID下的相邻时间间隔 http://www.flybi.net/article/107 跟你的问题比较类似
贴一个相关子查询的例子,较梁总的清晰一些。
大概的逻辑是:
  1. 外层循环整张表
  2. 内层对当前ID 的行进行大小对比,取出上一个日期的行

代码可直接执行。


SELECT *,
(
SELECT TOP 1 [date] FROM test T1
WHERE T1.ID = T.ID AND T1.[date] < T.[date]
ORDER BY T1.[date] DESC

) AS LastDate
FROM test T
ORDER BY ID, T.[date] DESC

要回复问题请先登录注册