Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с процедурой  [new]
Solonsky
Member

Откуда: Санкт-Петербург
Сообщений: 19
Проблема в следующем нужно смотреть по ходу движения вперед и разбивать на участки
С По Тип Улица и определять тип движение или остановка есть еще один стоянка если ТИП 1 и координаты не изменились и прошло N времени тогда стоянка. Все замечательно пока не встречаются проблемные места например по ходу движения тип стал 0(что есть выкл. зажигание это есть артефакт) или попалось пересечение улицы одна точка. Данные в табличке вот такие:
type start_date street lat lon
1 2009-09-14 14:25:14.000 Непокоренных пр. 4 59.997907 30.369333
1 2009-09-14 14:25:24.000 Непокоренных пр. 2 59.997987 30.367272
1 2009-09-14 14:26:29.000 Мужества пл. 59.998358 30.365292
0 2009-09-14 14:26:30.000 Мужества пл. 59.998358 30.365292
1 2009-09-14 14:26:38.000 Политехническая 17 к.1 59.999013 30.364855
1 2009-09-14 14:26:49.000 Тореза пр. 8 59.999792 30.363335
1 2009-09-14 14:27:02.000 Тореза пр. 9 60.000572 30.362260

в итоге должно получиться что-то вроде этого:
StartDate EndDate Street Type идр..................
2009-09-14 14:25:14.000 2009-09-14 14:25:24.000 Непокоренных пр. 1 .
2009-09-14 14:26:29.000 2009-09-14 14:26:30.000 Мужества пл. 1 .
2009-09-14 14:26:38.000 2009-09-14 14:27:02.000 Тореза пр. 1 .

вопрос в следующем как получить тип перед. текущий. следующий.

вот такая процедура получилась:
там два условия стоянка @ismove = 0 или движение @ismove = 1
без изменений она выдает след. данные что есть неверно:
2009-09-14 14:25:24.000 2009-09-14 14:25:24.000 Непокоренных пр. 1
2009-09-14 14:26:29.000 2009-09-14 14:25:24.000 Мужества пл. 0 <---- 1
2009-09-14 14:26:38.000 2009-09-14 14:25:24.000 Политехническая 1 1 <---- вообще не должно быть!
1900-01-01 00:00:00.000 2009-09-14 14:26:49.000 Тореза пр. 1

вот такая вот проблема:(

Сообщение было отредактировано: 15 окт 09, 08:34
14 окт 09, 20:23    [7787413]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с процедурой  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Solonsky,

тегом SRC так и не научились пользоваться?! Читать же невозможно...
14 окт 09, 20:36    [7787453]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с процедурой  [new]
Solonsky
Member

Откуда: Санкт-Петербург
Сообщений: 19
pkarklin,
USE [XXX]
GO
/****** Object: StoredProcedure [dbo].[X] Script Date: 10/14/2009 10:16:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[X]
@dataStart datetime,
@dataEnd datetime,
@block_id_in varchar(1024)
AS

declare @prev2_sens int
declare @prev2_date datetime
declare @prev2_street varchar(200)
declare @prev2_hnum varchar(20)
declare @prev2_lat float
declare @prev2_lon float

declare @prev_sens int
declare @prev_date datetime
declare @prev_street varchar(200)
declare @prev_hnum varchar(20)
declare @prev_lat float
declare @prev_lon float

declare @cur_sens int
declare @cur_date datetime
declare @cur_street varchar(200)
declare @cur_hnum varchar(20)
declare @cur_lat float
declare @cur_lon float

declare @move_street varchar(200) = ''
declare @start_date datetime = ''
declare @end_date datetime = ''

declare @ismove bit
declare @next_move int



declare @track table(
t1 datetime, -- время начала движения/остановки
t2 datetime, -- время завершения движения/остановки
addr varchar(200), -- адрес
type_op varchar(50), -- движение/остановка/стоянка/запрвка
move int
)


BEGIN
SET NOCOUNT ON;
DECLARE SLICE_CUR CURSOR READ_ONLY 
FOR 
select ((NS.sensor & 8)/8) as sensor
, NS.send_date
, dbo.GetAddress(street_seg_id) AS adr
, CASE WHEN house_num = '-1' THEN '' ELSE IsNull(house_num, '') END AS num
, NS.latitude
, NS.longitude
FROM dbo.J as NS
where NS.block_id in (@block_id_in)
and NS.send_date >= @dataStart and NS.send_date <= @dataEnd
ORDER BY NS.send_date ASC

OPEN SLICE_CUR;
FETCH NEXT FROM SLICE_CUR into @cur_sens,@cur_date,@cur_street,@cur_hnum,@cur_lat,@cur_lon

set @prev2_sens = @cur_sens; set @prev2_date = @cur_date; 
set @prev2_street = @cur_street; set @prev2_hnum = @cur_hnum;
set @prev2_lat = @cur_lat; set @prev2_lon = @cur_lon;

set @prev_sens = @cur_sens; set @prev_date = @cur_date; 
set @prev_street = @cur_street; set @prev_hnum = @cur_hnum; 
set @prev_lat = @cur_lat; set @prev_lon =@cur_lon;

/*if @prev_sens = 0 and @cur_sens = 0
set @ismove = 0;
else 
set @ismove = 1; 
*/
--set @ismove = @cur_sens;


WHILE @@FETCH_STATUS = 0
BEGIN

if @ismove = 0 --Если стоянка
begin
if @start_date = ''
begin
set @start_date = @prev_date; --Устанавливаем время нач. движения
end
if @prev2_sens = 0 and @prev_sens = 0 
begin
set @end_date = @cur_date;
end 
if @prev2_sens = 0 and @prev_sens = 0 and @cur_sens = 1
begin
insert into @track(t1,t2,addr,type_op)values(@start_date,@end_date,@prev_street,@prev_sens);
set @start_date = '';
end 
if @prev_sens = 1 and @prev2_sens = 1 and @cur_sens = 0
begin
insert into @track(t1,t2,addr,type_op)values(@start_date,@end_date,@prev_street,@prev_sens);
set @start_date = '';
end 
end 

if @ismove = 1 -- Если движение
begin
if @start_date = ''
begin
set @start_date = @prev_date;
end
if @prev2_street = @prev_street and @prev_street = @cur_street
begin
set @end_date = @cur_date;
end
if @prev2_street != @cur_street and @prev_street != @cur_street
begin
insert into @track(t1,t2,addr,type_op,move)values(@start_date,@end_date,@prev_street,@prev_sens,@ismove);
set @start_date = '';
end 
end 

set @prev2_sens = @prev_sens; set @prev2_date = @prev_date; set @prev2_street = @prev_street; set @prev2_hnum = @prev_hnum; set @prev2_lat = @prev_lat; set @prev2_lon =@prev_lon;

set @prev_sens = @cur_sens; set @prev_date = @cur_date; 
set @prev_street = @cur_street; set @prev_hnum = @cur_hnum; 
set @prev_lat = @cur_lat; set @prev_lon =@cur_lon;

FETCH NEXT FROM SLICE_CUR into @cur_sens, @cur_date ,@cur_street ,@cur_hnum, @cur_lat, @cur_lon
-- set @ismove = @cur_sens;
if @prev_sens = 0 and @cur_sens = 0
set @ismove = 0;
else 
set @ismove = 1; 

END
insert into @track(t1,t2,addr,type_op,move)values(@start_date,@prev_date,@cur_street,@prev_sens,-1);

CLOSE SLICE_CUR
DEALLOCATE SLICE_CUR

select * from @track -- Получаем все данные из табличка

END
15 окт 09, 01:51    [7788202]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с процедурой  [new]
aleks2
Guest
Тредстартер, ежели ты ВНЯТНО изложишь алгоритм задачи, то тебе, скорее всего, сделают даже БЕЗ курсоров, а разбираться в мутном потоке чужого кода - это на любителя... извращений.
15 окт 09, 07:07    [7788322]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить