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

Откуда:
Сообщений: 44
Зравствуйте, помогите разобраться пожалуйста, есть результат

                                                                Код
2015-07-24 07:00:31.000	2015-07-24 00:00:00.000	2	0447	N05	NULL	2015-07-24 07:00:45.000
2015-07-24 07:00:45.000	2015-07-24 00:00:00.000	2	0447	N01	NULL	2015-07-24 07:03:08.000
2015-07-24 07:03:08.000	2015-07-24 00:00:00.000	2	0447	N04	NULL	2015-07-24 07:12:09.000
2015-07-24 07:12:09.000	2015-07-24 00:00:00.000	2	0447	[b]O43[/b]	NULL	2015-07-24 07:14:59.000
2015-07-24 07:14:59.000	2015-07-24 00:00:00.000	2	0447	N04	NULL	2015-07-24 07:18:55.000
2015-07-24 07:18:55.000	2015-07-24 00:00:00.000	2	0447	N04	N041	2015-07-24 07:19:07.000
2015-07-24 07:19:07.000	2015-07-24 00:00:00.000	2	0447	N04	NULL	2015-07-24 07:19:54.000
2015-07-24 07:19:54.000	2015-07-24 00:00:00.000	2	0447	N04	N041	2015-07-24 07:20:07.000


мне нужно вычислить код который приходит перед кодом O43 данные меняются, количество строк тоже и код перед О43 меняется, нужно вывести только код перед О43.

пробовал что то типа

;with est as (select row_number() over(order by START_TIMESTAMP) as String,
    STATUS_CODE as code
from
    EQUIPMENT_STATUS_TRANS
where EQUIP_IDENT = '0447'
and SHIFT_DATE = '2015-07-24'
and SHIFT_IDENT = '2')
select est.String, est.code
	from est as est


результат

1	N03
2	N03
3	N05
4	N01
5	N04
6	O43
7	N04
8	N04
9	N04
10	N04
11	N07
12	N03...


как допилить не пойму, нумерация сбивается если уменьшаю кол-во записей... помогите плз может по другому как то можно
24 июл 15, 15:11    [17930637]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
FastTI,

Может, намекнёте про версию сервера?
24 июл 15, 15:13    [17930646]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
FastTI
Member

Откуда:
Сообщений: 44
iap,

ссори
Microsoft SQL Server 2008 R2 (SP2)
24 июл 15, 15:21    [17930703]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
est-est
Guest
FastTI,

select est.String, est.code, est_prev.code as code_prev
	from est as est
join est as est_prev on est_prev.string = est.string - 1


?
24 июл 15, 16:08    [17931028]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Чтобы выбрать "перед", данные необходимо упорядочить средствами запроса.
24 июл 15, 17:02    [17931396]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
FastTI
Member

Откуда:
Сообщений: 44
Владислав Колосов,

а можно уточнить момент упорядочивания.
27 июл 15, 08:09    [17937421]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
FastTI
Member

Откуда:
Сообщений: 44
est-est,

таким образом получается отсчет строк начался не с 1-го а с 2-х
27 июл 15, 08:11    [17937423]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
FastTI,

если в таблице гарантирован порядок (время не накладывается), то найдите ID требуемого кода и запросите строку с ID-1. Это и показал est-est.
27 июл 15, 12:46    [17938656]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
FastTI
Member

Откуда:
Сообщений: 44
Владислав Колосов,

время накладывается, данные поступают постоянно
27 июл 15, 16:56    [17940656]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
o-o
Guest
declare @t table (START_TIMESTAMP datetime, STATUS_CODE varchar(10));
insert into @t values  
('2015-07-24 07:00:31.000',	'N05'),	
('2015-07-24 07:00:45.000',	'N01'),	
('2015-07-24 07:03:08.000',	'N04'),	
('2015-07-24 07:12:09.000',	'O43'),	
('2015-07-24 07:14:59.000',	'N04'),
('2015-07-24 07:18:55.000',	'N04'),	
('2015-07-24 07:19:07.000',	'N04'),	
('2015-07-24 07:19:54.000',	'N04');	

with cte as 
(
select *, ROW_NUMBER() over (order by START_TIMESTAMP) as rn
from @t
)

select c1.*, c2.START_TIMESTAMP as prev_dt, c2.STATUS_CODE as prev_code
from cte c1 join cte c2 on c1.rn - 1 = c2.rn
where c1.STATUS_CODE = 'O43' 
---
START_TIMESTAMP	STATUS_CODE	rn	prev_dt	prev_code
2015-07-24 07:12:09.000	O43	4	2015-07-24 07:03:08.000	N04
27 июл 15, 17:20    [17940786]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
FastTI
Member

Откуда:
Сообщений: 44
o-o,

Большое человеческое спасибо... Это сработало
28 июл 15, 13:20    [17944828]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
Jaffar
Member

Откуда:
Сообщений: 633
так проще
select t.*,
LAG(t.ID) over(order by t.Dt asc) ID_Prev
from @__TEMP t
28 июл 15, 14:02    [17945064]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Jaffar
так проще
select t.*,
LAG(t.ID) over(order by t.Dt asc) ID_Prev
from @__TEMP t
Я с этого начал: 17930646
28 июл 15, 14:04    [17945072]     Ответить | Цитировать Сообщить модератору
 Re: Определить предыдущую запись  [new]
o-o
Guest
FastTI
iap,
ссори
Microsoft SQL Server 2008 R2 (SP2)

так нагляднее
28 июл 15, 14:24    [17945181]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить