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

Откуда:
Сообщений: 3
Привет участникам!

Помогите, плиз, решить простенькую задачку:
Автопаркинг. При въезде авто на стоянку регистрируется Дата, №карты(16-ричный), Зона.
Задача в том, чтобы периодически очищать журнал транзакций от покинувших парковку карт, а если карта на парковке, то убрать все транзакции кроме последнего въезда.

У меня получается только выезды убрать.
Не ругайтесь громко... я в T-SQL профан
24 окт 09, 05:10    [7833269]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
Alexey.T
Member

Откуда:
Сообщений: 3
Вроде написал что-то...

declare @num as int
declare @trans as int
while transactions     /*Не знаю как организовать цикл от последней до первой транзакции*/
   begin
      set @num = n_card()     /*Номер карты*/
      if (zone_out != 1)      /*Зона 1 = На паркинге*/
      {
         delete from transactions
         where (n_card() == @num)
      }
      else
      {
         set @trans = n_trans()     /*Номер транзакции*/
         delete from transactions
         where ((n_card() == @num) and (n_trans() < @trans))
      }
   end

Подскажите, плиз, с циклом...
24 окт 09, 08:13    [7833311]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
aleks2
Guest
Alexey.T
Вроде написал что-то...

declare @num as int
declare @trans as int
while transactions     /*Не знаю как организовать цикл от последней до первой транзакции*/
   begin
      set @num = n_card()     /*Номер карты*/
      if (zone_out != 1)      /*Зона 1 = На паркинге*/
      {
         delete from transactions
         where (n_card() == @num)
      }
      else
      {
         set @trans = n_trans()     /*Номер транзакции*/
         delete from transactions
         where ((n_card() == @num) and (n_trans() < @trans))
      }
   end

Подскажите, плиз, с циклом...


Сами и синтаксис придумываете? Oooo...!

1. Для начала уточните постановку
>>При въезде авто на стоянку регистрируется Дата, №карты(16-ричный), Зона.
>>У меня получается только выезды убрать.
Как-то нестыковочка получается: убираем то, чего нет? Или всеж выезды тоже регистрируются?

2. Тыды чем эти записи отличаются или только "по факту": сначала въезд - потом выезд?
Дык, опять же, вопрос: как в этом случае поступать со сбоями системы регистрации? А ну как въезд или выезд будет пропущен?
24 окт 09, 09:10    [7833332]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
Alexey.T
Member

Откуда:
Сообщений: 3
В журнале регистрируется все... и въезды, и выезды, и ошибки проездов (на шлагбаумах стоят 2 стойки... одна въездная - выдает карту (регистрирует проезд в зону 1), вторая выездная - забирает карту (регистрирует проезд в зону 0)).

Насчет сбоев: Стойки работают как в сетевом, так и в автономном режиме. Т.е. при сбое на сервере переходят в автономный режим и помнят все события. При запуске сервера все события передаются.

Задача заключается в следующем:
Если карты на парковке нет (т.е. по этой карте последним зарегистрирован проезд в зону 0), то надо удалить все транзакции по этой карте (и въезды, и выезды, и ошибки).
Если же карта на парковке (т.е. в зоне 1), надо оставить этот въезд (последний), а все предыдущие транзакции по этой карте снести за ненадобностью.

Насчет синтаксиса... Я в T-SQL ни бумбум... поможете?

А в общем ничего сложного, только как это грамотно оформить для SQL
24 окт 09, 10:11    [7833373]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
iljy
Member

Откуда:
Сообщений: 8711
Alexey.T,

насколько я понял - надо удалить все статусы и оставить только последний въезд? А сервер какой? Для 2005 и выше - примерно так
;with cte as
(
	select *, ROW_NUMBER() over(PARTITION by N_Card order by date desc) N
	from Table1
)
delete from cte
where N>1 or zone_out = 0
24 окт 09, 10:40    [7833413]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
aleks2
Guest
--Дата, №карты(16-ричный), Зона.
declare @t table([Дата] datetime, [№карты] nvarchar(8), [Зона] tinyint, primary key clustered([Дата],[№карты]))

-- изображаем пример
insert @t
select '20091001 11:00', '0000000', 1
union all
select '20091001 11:01', '0000000', 0
union all
select '20091001 11:02', '0000000', 1
union all
select '20091001 11:00', '0000001', 1
union all
select '20091001 11:01', '0000001', 0

-- изничтожаем
begin transaction

delete t
FROM @t t inner JOIN (select * FROM @t WHERE [Зона]=0) t0
ON t.[№карты]=t.[№карты] AND t.[Дата]<t0.[Дата]
where t.[Зона]=1 

delete t
FROM @t t
where [Зона]=0

commit transaction

-- демонстрируем результат
select * from @t
24 окт 09, 11:02    [7833446]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по очистке журнала транзакций  [new]
aleks2
Guest
Очепятка

ON t.[№карты]=t0.[№карты] AND t.[Дата]<t0.[Дата]
24 окт 09, 11:27    [7833485]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить