Sql 解决方案的类型。我知道它可以很好地工作,但新的开发人员或承包商需要对系统有更多的了解才能开始使用您的系统,这会降低代码库中的可维护性。有很多更好、更容易理解和维护的方法来执行相同的任务。最重要的是,为了收集相同的数据,您仍然需要构建与实现此新方法相同的基本
Sql 解决方案的类型。我知道它可以很好地工作,但新的开发人员或承包商需要对系统有更多的了解才能开始使用您的系统,这会降低代码库中的可维护性。有很多更好、更容易理解和维护的方法来执行相同的任务。最重要的是,为了收集相同的数据,您仍然需要构建与实现此新方法相同的基本,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,解决方案的类型。我知道它可以很好地工作,但新的开发人员或承包商需要对系统有更多的了解才能开始使用您的系统,这会降低代码库中的可维护性。有很多更好、更容易理解和维护的方法来执行相同的任务。最重要的是,为了收集相同的数据,您仍然需要构建与实现此新方法相同的基本查询复杂性。您只是在更改比较类型。@Michael-我对@OMG Ponies answer中的简单不存在解决方案打了折扣,因为它附带了注释,但我现在测试了它,发现它比我的好,因为它在temp1上节省了扫描时间!。。。另外,通过将JOIN更改为
解决方案的类型。我知道它可以很好地工作,但新的开发人员或承包商需要对系统有更多的了解才能开始使用您的系统,这会降低代码库中的可维护性。有很多更好、更容易理解和维护的方法来执行相同的任务。最重要的是,为了收集相同的数据,您仍然需要构建与实现此新方法相同的基本查询复杂性。您只是在更改比较类型。@Michael-我对@OMG Ponies answer中的简单
不存在
解决方案打了折扣,因为它附带了注释,但我现在测试了它,发现它比我的好,因为它在temp1上节省了扫描时间
!。。。另外,通过将JOIN
更改为LEFT JOIN temp2 t2 ON t2.value,介于DATEADD(MINUTE,-1,t1.value)和DATEADD(MINUTE,1,t1.value)
之间,可以大大改进原始查询。尽管它仍然被其他人打败。
create table temp1
(
id int identity primary key,
value datetime not null
)
GO
create index ix_temp1 on temp1(value, id);
GO
set nocount on
insert temp1 (value) values (DATEADD(second, rand() * 1000000, '20100101'))
GO 15000
create table temp2
(
id int identity primary key,
value datetime not null
)
GO
create index ix_temp2 on temp2(value, id);
GO
set nocount on
insert temp2 (value) values (DATEADD(second, rand() * 1000000, '20100101'))
GO 15000
SELECT t1.id, t1.value
FROM temp1 t1
LEFT JOIN temp2 t2
ON t1.value between DATEADD(MINUTE, -1, t2.value) and DATEADD(MINUTE, 1, t2.value)
WHERE t2.value is null
SELECT t1.id,
t1.value
FROM temp1 t1
WHERE NOT EXISTS(SELECT NULL
FROM temp2 t2
WHERE t2.value BETWEEN DATEADD(MINUTE, -1, t1.value)
AND DATEADD(MINUTE, 1, t1.value))
SELECT t.id,
t.value
FROM
(
SELECT t1.id,
t1.value,
(SELECT MIN(temp2.value) FROM temp2 WHERE temp2.value >= t1.value) as theNext,
(SELECT MAX(temp2.value) FROM temp2 WHERE temp2.value <= t1.value) as thePrev
FROM temp1 t1
) t
WHERE DATEDIFF(second, t.value, t.theNext) > 60
AND DATEDIFF(second, t.thePrev, t.value) > 60
LEFT JOIN temp2 t2
ON t1.value BETWEEN DATEADD(MINUTE, -1, t2.value) AND DATEADD(MINUTE, 1, t2.value)
LEFT JOIN temp2 t2
ON t2.value BETWEEN DATEADD(MINUTE, -1, t1.value) AND DATEADD(MINUTE, 1, t1.value)
create table temp2
(
id int identity primary key,
timeValue int not null
)
DECLARE @newTime int;
SET @newTime = dbo.fnGetComparisonTime(@DateTimeValue)
SELECT id, timeValue
FROM temp2
WHERE timeValue NOT BETWEEN (@newTime - 1) AND @newTime;
CREATE FUNCTION dbo.fnGetComparisonTime
(
@DateTimeValue datetime
)
RETURNS int
AS
BEGIN
-- Declarations
DECLARE @Output int
DECLARE @StartDate datetime
SET @StartDate = '2000-01-01 00:00:00'
SET @Output = DATEDIFF(minute, @StartDate, @ReportDateTime)
-- And we're done!
RETURN @Output
END