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

Откуда:
Сообщений: 2
Добрый День!
Есть таблица tblRashody(ID, Data, NomerScheta, PredData)
Мне необходимо чтобы в PredData, выводилась предыдущая дата по этому счету (по одному счету может быть несколько оплат-расходов).
PredData и Data - тип дата и время, в формате по умолчанию.
Мне необходимо сделать это при помощи триггера, либо в представлении, т.к. могут записи добавляться задним числом(нужно чтобы поле было обновляемым).
В триггер пишу:
UPDATE tblRashody SET PredData = (SELECT TOP 1 Data FROM tblRashody WHERE Data < <Data> ORDER BY Data DESC)
Условия пока все убрал, исхожу из самого простого для начала. В итоге триггер во все ячейки поля PredData ставит одинаковую дату(предыдущую активной измененной).
Например таблица выглядит так:
ID Data NomerScheta PredData
1 12.08.2013 1
2 13.08.2013 2
3 14.08.2013 1
4 15.08.2013 2

Мне необходимо чтобы стало так:
ID Data NomerScheta PredData
1 12.08.2013 1 12.08.2013
2 13.08.2013 2 13.08.2013
3 14.08.2013 1 12.08.2013
4 15.08.2013 2 13.08.2013

У меня на данный момент работает так:
ID Data NomerScheta PredData
1 12.08.2013 1 12.08.2013
2 13.08.2013 2 12.08.2013
3 14.08.2013 1 12.08.2013
4 15.08.2013 2 12.08.2013
24 сен 13, 12:17    [14876689]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
select t1.ID, t1.Data, t1.NomerScheta, PredData.Data
from tblRashody t1
outer apply (select top 1 Data from tblRashody
				  where NomerScheta = t1.NomerScheta
				  and Data < 	t1.Data
				  order by Data desc   
				  ) PrevData
24 сен 13, 12:32    [14876791]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
prog882
Guest
And1983,

declare @t table (ID int, Data date, NomerScheta int)
insert @t 
select 1, '20130812', 1 union all
select 2, '20130813', 2 union all
select 3, '20130814', 1 union all
select 4, '20130815', 2

select t1.ID, t1.Data, t1.NomerScheta, 
Data2=isnull(t2.Data,t1.Data)
from 
(select id, Data, NomerScheta, rn=ROW_NUMBER() over(order by NomerScheta, Data) from @t) t1
left join 
(select id, Data, NomerScheta, rn=ROW_NUMBER() over(order by NomerScheta, Data) from @t) t2 
on t2.rn=t1.rn-1 and t1.NomerScheta = t2.NomerScheta
order by t1.Data
24 сен 13, 12:55    [14876969]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
mike909
Member

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

Если sql2012, то
select t.*, isnull( Lag( t.Data, 1, null) over(partition by t.NomerScheta order by t.Data asc), t.Data) 
from @t as t
order by t.id
24 сен 13, 13:11    [14877061]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
samoxod
Member

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

С таблицей INSERTED связь указана в UPDATE в триггере?
24 сен 13, 13:48    [14877304]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
And1983
Member

Откуда:
Сообщений: 2
У меня SQL2008

samoxod - да в UPDATE

мне нужно чтобы поле было обновляемым, таблица то уже есть, и при вносе строчек задним числом, нужно чтобы поле PredData только обновлялось.
24 сен 13, 14:52    [14877714]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
Remind
Member

Откуда: UK
Сообщений: 523
with cte(ID, Data, NomerScheta) as (
	select 1, '2013-08-12', 1
	union
	select 2, '2013-08-13', 2
	union
	select 3, '2013-08-14', 1
	union
	select 4, '2013-08-15', 2
)
select 
ID,
DATA,
NomerScheta,
PredData = LAG(Data,1,Data) OVER (Partition by NomerScheta order by Data)
from cte
order by id
24 сен 13, 15:14    [14877859]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с предыдущей датой  [new]
samoxod
Member

Откуда: Москва
Сообщений: 31
And1983,
Update t set t.PrevData = ISNULL(p.PrevData,t.Data)
from tblRashody t
INNER JOIN 
(
	Select s.id as id, PD.PrevData as PrevData
	from tblRashody s
	INNER JOIN 
	(
		Select distinct NomerScheta  from INSERTED)
	) as NS
	ON s.NomerScheta = NS.NomerScheta
	cross apply (select max(Data) as PrevData from tblRashody where NomerScheta = s.NomerScheta and  Data < s.Data) as PD
) as p 
on t.ID = p.id
24 сен 13, 16:06    [14878326]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить