Tôi đã có một loạt các bảng với nhiều dữ liệu có độ chính xác cao được thu thập từ các thiết bị khác nhau. Các khoảng thời gian mà chúng được thu thập khác nhau và thậm chí là đi lang thang trong chuỗi thời gian. Người dùng của tôi muốn có khả năng chọn phạm vi ngày và nhận mức trung bình / phút / tối đa trên các biến này với tần suất cụ thể. Đây là cú đâm thứ hai tôi đã thực hiện, và nó hoạt động, nhưng tôi tự hỏi liệu có cách nào tốt hơn / nhanh hơn để thực hiện điều này không?
declare @start datetime
declare @end datetime
set @start = '3/1/2012'
set @end = '3/3/2012'
declare @interval int
set @interval = 300
declare @tpart table(
dt datetime
);
with CTE_TimeTable
as
(
select @start as [date]
union all
select dateadd(ss,@interval, [date])
from CTE_TimeTable
where DateAdd(ss,@interval, [date]) <= @end
)
insert into @tpart
select [date] from CTE_TimeTable
OPTION (MAXRECURSION 0);
select t.dt, avg(c.x1), min(c.x1), max(c.x2), avg(c.x2), min(c.x2), max(c.x2) from clean.data c ,
@tpart t
where
ABS(DateDIFF(ss, t.dt , c.Date) ) <= @interval /2
and
Date >= @start
and
Date <= @end
group by t.dt
Hiện tại có hơn 32721 hàng trong khoảng thời gian 3 ngày này, truy vấn này mất khoảng 43 giây để chạy và cung cấp cho tôi 577 hàng tôi mong đợi nhưng tôi muốn có được điều này nhanh hơn. Các hit lớn đến từ vòng lặp lồng nhau để thực hiện tham gia bên trong.
DATEDIFF
tuyên bố đó là gì?
ABS(DateDIFF(ss, t.dt , c.Date) )
? Bạn có thể lập chỉ mục nó. Theo hiểu biết của tôi (có thể là WAAAAY sai), không phải hoạt động trên c.Date
cột trong WHERE
cơ bản làm cho chỉ mục trở nên vô dụng?
WHERE
mệnh đề.
clean.data
? Ngoài ra, bạn có thể giải thích lý do tại sao bạn tham gia chéo nó@tpart
?