Скрипты предназначены для точного выяснения периодов отбивки терминалов во время стоянки (стоянка определяется по скорости 0)
При этом, делается отступ в 400 секунд от первой координаты в стоянке, дабы исключить
скрипт разделен на две части - скрипт сбора данных, и скрипт их анализа - сделано это по причине большого количество координат для обработки.
Для хранения данных используется отдельно созданная таблица bn_patp_dob.dbo.temp_data_period
Таблица для хранения данных (в базе данных [bn_patp_dob]) - скрипт создания - достаточно создать таблицы один раз
Код
USE [bn_patp_dob]
GO
/****** Объект: Table [dbo].[temp_data_period] Дата сценария: 04/02/2012 13:26:10 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[temp_data_period]') AND type in (N'U'))
DROP TABLE [dbo].[temp_data_period]
/****** Объект: Table [dbo].[temp_data_period] Дата сценария: 04/02/2012 13:26:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[temp_data_period](
[id][int]IDENTITY(1,1) NOT NULL,
[TRANSPORT_ID] [int]NOT NULL,
[ss][int]NOT NULL,
CONSTRAINT [PK_temp_data_period] PRIMARY KEY CLUSTERED
(
[id]ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
[PRIMARY]) ON
[PRIMARY]
Скрипт сбора данных (заполнения вспомогательной таблицы) - для каждого периода анализа запускается отдельно
Код
delete from [bn_patp_dob].[dbo].[temp_data_period]
set dateformat dmy
set nocount on
declare @tt datetime, @last_tt datetime,@TRANSPORT_ID int
declare cur_t cursor local for
select id from [BN_PATP].dbo.PATP_Transport as T;
open cur_t
while 1=1 begin
fetch next from cur_t into @TRANSPORT_ID
if @@fetch_status!=0 break
print @TRANSPORT_ID
declare @speed int, @last_speed datetime
declare cur cursor local read_only for
select tele_time,speed from [BN_PATP].[dbo].[SYS_DEV_ArchiveData] as AD
where TRANSPORT_ID=@TRANSPORT_ID and
tele_time between '31/03/2012' and '02/04/2012' -- период анализа данных
order by tele_time
open cur
set @last_tt=null
set @last_speed=null
while 1=1 begin
fetch next from cur into @tt,@speed
if @@fetch_status!=0 break
if @last_tt is not null and @speed=0 and abs(datediff (ss,@last_speed,@tt))>=400 and @last_speed is not null
insert into bn_patp_dob.dbo.temp_data_period values (@TRANSPORT_ID, datediff (ss,@last_tt,@tt))
select @last_tt=@tt
if @speed>0 set @last_speed=@tt
end
close cur
deallocate cur
end
close cur_t
deallocate cur_t
где '31/03/2012' and '02/04/2012' -- период анализа данных
скрипт выявления периодов:
Код
select Org.Shortname,trans.Gos_Number,d.code,d.tel_number,t1.[TRANSPORT_ID], t1.trc,tr.ss
from
(select t.[TRANSPORT_ID] as [TRANSPORT_ID], max (tr.c) as trc
from [bn_patp_dob].[dbo].[temp_data_period] as t
inner join (select [TRANSPORT_ID],ss, count(*) as c
FROM [bn_patp_dob].[dbo].[temp_data_period]
group by [TRANSPORT_ID],ss) as tr on t.[TRANSPORT_ID]=tr.[TRANSPORT_ID]
group by t.[TRANSPORT_ID]
) as t1
inner join
(select [TRANSPORT_ID],ss, count(*) as c
FROM [bn_patp_dob].[dbo].[temp_data_period]
group by [TRANSPORT_ID],ss)
as tr on t1.[TRANSPORT_ID]=tr.[TRANSPORT_ID] and t1.trc=tr.c
inner join bn_patp.dbo.PATP_Transport as trans on trans.id=t1.[TRANSPORT_ID]
inner join bn_patp.dbo.SYS_DEV_Device as d on d.id=trans.device_id
inner join bn_patp.dbo.SYS_OrgRequisite as Org on Org.Id=trans.OrgId
where trc>=5 and ss<180
order by d.code
на выходе таблица:
где колонка trc - количество посылок с периодом
ss - период между посылками
например:
М454КА 00051965 +7 910 651 563 263 15
прибор 00051965, период в стоянке 15, прислано 263 координаты за период анализа.