27,580
社区成员
发帖
与我相关
我的任务
分享
with v as
(select a.Card_ID,a.Locator_ID,a.StartTime,a.EndTime,a.StartTime 'x'
from T a
where not exists(select 1
from T b
where b.Card_ID=a.Card_ID and b.Locator_ID=a.Locator_ID
and b.EndTime=a.StartTime)
union all
select d.Card_ID,d.Locator_ID,d.StartTime,d.EndTime,c.x
from v c
inner join T d on c.Card_ID=d.Card_ID and c.Locator_ID=d.Locator_ID
and c.EndTime=d.StartTime)
select Card_ID,Locator_ID,min(StartTime) 'StartTime',max(EndTime) 'EndTime'
from v
group by Card_ID,Locator_ID,x
select d.Card_ID,d.Locator_ID,d.StartTime,d.EndTime,c.x
from v c
inner join T d on c.Card_ID=d.Card_ID and c.Locator_ID=d.Locator_ID and c.EndTime=d.StartTime)
是这样吗?--用函数查找的方式
CREATE TABLE T (
Card_ID int,
Locator_ID int,
StartTime int,
EndTime int
)
INSERT INTO T VALUES(100,1,1,2)
INSERT INTO T VALUES(100,1,2,3)
INSERT INTO T VALUES(100,1,3,4)
INSERT INTO T VALUES(100,1,5,6)
GO
CREATE FUNCTION f_GetFinalTime(@StartTime int)
RETURNS int
AS
BEGIN
DECLARE @FinalTime int
SELECT @FinalTime = EndTime FROM T WHERE StartTime = @StartTime
WHILE (@@ROWCOUNT <>0)
BEGIN
SELECT @FinalTime = EndTime FROM T WHERE StartTime = @FinalTime
END
RETURN @FinalTime
END
GO
SELECT Card_ID,
Locator_ID,
StartTime,
dbo.f_GetFinalTime(StartTime)
FROM T
WHERE NOT EXISTS (SELECT *
FROM T TX
WHERE TX.EndTime = T.StartTime)
----------------------------------------------------------------
-- Author :DBA_HuangZJ(發糞塗牆)
-- Date :2014-07-28 10:54:53
-- Version:
-- Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
-- May 14 2014 18:34:29
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([Card_ID] int,[Locator_ID] int,[StartTime] int,[EndTime] int)
insert [huang]
select 100,1,1,2 union all
select 100,1,2,3 union all
select 100,1,3,4 union all
select 100,1,5,6
--------------开始查询--------------------------
;WITH cte AS (
select * ,ROW_NUMBER()OVER(PARTITION BY [Card_ID],[Locator_ID] ORDER BY [StartTime])oid
from [huang]),
cte1 AS
(
SELECT * ,1 [level]
FROM cte WHERE oid=1
UNION ALL
SELECT a.Card_ID,a.Locator_ID,CASE WHEN a.starttime=b.endtime THEN b.starttime ELSE a.starttime END starttime,CASE WHEN b.starttime=a.endtime THEN b.starttime ELSE a.endtime END endtime ,a.oid ,
CASE WHEN a.starttime=b.endtime OR b.starttime=a.endtime THEN b.[level] ELSE b.[level]+1 END [level]
FROM cte a INNER JOIN cte1 b ON a.Card_ID=b.Card_ID AND a.Locator_ID=b.Locator_ID AND a.oid=b.oid+1
)
SELECT Card_ID,Locator_ID,MIN(starttime)starttime,MAX(endtime)endtime
FROM cte1
GROUP BY Card_ID,Locator_ID,[level]
----------------结果----------------------------
/*
Card_ID Locator_ID StartTime EndTime
-----------------------------------------------------------------------
100 1 1 4
100 1 5 6
*/
create table T
(Card_ID int,Locator_ID int,StartTime int,EndTime int)
insert into T
select 100,1,1,2 union all
select 100,1,2,3 union all
select 100,1,3,4 union all
select 100,1,5,6
with v as
(select a.Card_ID,a.Locator_ID,a.StartTime,a.EndTime,a.StartTime 'x'
from T a
where not exists(select 1
from T b
where b.Card_ID=a.Card_ID and b.Locator_ID=a.Locator_ID
and b.EndTime=a.StartTime)
union all
select d.Card_ID,d.Locator_ID,d.StartTime,d.EndTime,c.x
from v c
inner join T d on c.Card_ID=d.Card_ID and c.Locator_ID=d.Locator_ID
and c.EndTime=d.StartTime)
select Card_ID,Locator_ID,min(StartTime) 'StartTime',max(EndTime) 'EndTime'
from v
group by Card_ID,Locator_ID,x
/*
Card_ID Locator_ID StartTime EndTime
----------- ----------- ----------- -----------
100 1 1 4
100 1 5 6
(2 row(s) affected)
*/
ALTER TABLE T
ADD FinalTime int
GO
UPDATE T
SET FinalTime = EndTime
WHERE NOT EXISTS (SELECT *
FROM T TX
WHERE T.EndTime = TX.StartTime)
WHILE (@@ROWCOUNT<>0)
BEGIN
UPDATE T
SET FinalTime = TX.FinalTime
FROM T, T TX
WHERE T.EndTime = TX.StartTime
AND T.FinalTime IS NULL
AND TX.FinalTime IS NOT NULL
END
GO
SELECT Card_ID,
Locator_ID,
StartTime,
FinalTime
FROM T
WHERE NOT EXISTS (SELECT *
FROM T TX
WHERE TX.EndTime = T.StartTime)
case when Flag = 0 then ( @cnt=@cnt+1) end
sql server语法不支持:“=附近有语法错误”
mysql倒是可以。