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

Откуда:
Сообщений: 5
Добрый день уважаемые программисты, так как в SQL я не очень силен, пришлось прибегнуть к вашей помощи.
В общем, мне необходимо реализовать некую ротацию данных, не могу сообразить как реализовать данный механизм.

Предположим у меня есть некая таблица A и B

В таблице A содержаться информация допустим следующего характера:

A
автор
1 Привет
2 Пока
3 Как дела?
4 Нормуль


Я выполняю некие действия в процедуре и переношу данные из таблицы (при каждом вызове процедуры) A в таблицу B по одной записи которые на данный момент еще не присутствуют в таблице B

A
автор
1 Привет
2 Пока
3 Как дела?
4 Нормуль


B
автор
1 Привет 2015-11-06 10:52:21.123


Соответственно после 4-х вызовов таблица B будет заполнена всеми данными из таблицы A, при последующих вызовах мне нужно организовать ротацию, чтобы данные по кругу переносились из таблицы A в таблицу B.

Надеюсь объяснил доступно, но если где-то что-то не понятно, укажите я постараюсь изложить мысль подробнее.
6 ноя 15, 11:57    [18377402]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Brian Kernighan
Надеюсь объяснил доступно, но если где-то что-то не понятно, укажите я постараюсь изложить мысль подробнее.

Что вы попробовали и что у вас не получилось ?
6 ноя 15, 11:58    [18377412]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Brian Kernighan
Member

Откуда:
Сообщений: 5
  DECLARE @today DATE = GETDATE(); 
 DECLARE @nextDay DATE = DATEADD(DAY, 1, GETDATE())
 DECLARE @currTime TIME = CAST(GETDATE() AS TIME)

 DECLARE @msisdn BIGINT = 988852222;

 DECLARE @groupId INT = 0;
 DECLARE @serviceId INT = 0;
 DECLARE @languageId INT = 0;

 DECLARE @tailId INT = 0;
 DECLARE @tailText NVARCHAR(140) = '';

 DECLARE @dataCoding VARCHAR(10) = 'UCS2';
 DECLARE @messageText NVARCHAR(140) = N'Голосовая почта: 13 новых сообщений. Последнее с:988016250 д:27/10 в:11:09. Прослушать по номеру 2007.';

 SELECT TOP 1 @serviceId = ServiceId, @languageId = LanguageId 
 FROM dbo.ServicesTemplates
 WHERE (SELECT SMS_NOTIFICATION_SERVER_NA.dbo.fn_RegExpIsMatch(@messageText, Template)) = 1

 DECLARE @Tails TABLE 
 (
  ID INT,
  GroupId INT,
  [Text] NVARCHAR(140),
  [Length] INT,
  ServiceId INT, 
  LanguageId INT,
  [Priority] BIT
 )

 INSERT INTO @Tails  
 SELECT t.ID, t.GroupId, t.[Text], t.[Length], ts.ServiceId, t.LanguageId, t.[Priority] 
 FROM dbo.Tails t
 INNER JOIN dbo.TailsSchedulers ts
 ON ts.GroupId = t.GroupId AND ts.ServiceId = @serviceId AND t.LanguageId = @languageId AND t.IsDefault = 0 AND t.[State] = 1

 /* SELECT *
 FROM @Tails t
 LEFT JOIN dbo.TailsHistory th 
 ON t.ServiceId = th.ServiceId AND th.MSISDN = @msisdn
 WHERE th.GroupId IS NULL
 ORDER BY t.[Priority] ASC, t.[Length] DESC */

 //Здесь по моим соображениям, должна была выбираться запись которая NULL в случае если она не присутствует в Истории Tails, но почему это не так..
 SELECT TOP 1 @tailId = t.ID, @groupId = t.GroupId
 FROM @Tails t
 LEFT JOIN dbo.TailsHistory th 
 ON th.GroupId = t.GroupId AND th.ServiceId = t.ServiceId AND th.MSISDN = @msisdn
 WHERE th.GroupId IS NULL
 ORDER BY t.[Priority] ASC, t.[Length] DESC

 INSERT INTO dbo.TailsHistory (TailId, GroupId, ServiceId, LanguageId, MSISDN, [DateTime]) 
 VALUES (@tailId, @groupId, @serviceId, @languageId, @msisdn, GETDATE())

 INSERT INTO dbo.TailsHistory (TailId, GroupId, ServiceId, LanguageId, MSISDN, [DateTime]) 
 VALUES (@tailId, @groupId, @serviceId, @languageId, @msisdn, GETDATE())
6 ноя 15, 12:11    [18377476]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Brian Kernighan
Member

Откуда:
Сообщений: 5
Нижний INSERT случайно продублировал.
6 ноя 15, 12:13    [18377485]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Brian Kernighan,

полагаю, что это можно организовать курсором. При подключении клиента создаете глобальный курсор в процедуре читаете NEXT, FIRST. Задача, в общем, полностью не раскрыта для подходящего решения.
6 ноя 15, 12:43    [18377675]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Brian Kernighan
 //Здесь по моим соображениям, должна была выбираться запись которая NULL в случае если она не присутствует в Истории Tails, но почему это не так..
 SELECT TOP 1 @tailId = t.ID, @groupId = t.GroupId
 FROM @Tails t
 LEFT JOIN dbo.TailsHistory th 
 ON th.GroupId = t.GroupId AND th.ServiceId = t.ServiceId AND th.MSISDN = @msisdn
 WHERE th.GroupId IS NULL
 ORDER BY t.[Priority] ASC, t.[Length] DESC

Т.е. вы select не можете написать ? Или что ?
6 ноя 15, 12:55    [18377761]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Brian Kernighan
Member

Откуда:
Сообщений: 5
Да, я не могу написать правильно SELECT.

Объясню еще раз на псевдо примере:

Таблица А
A
B
C
D
E

История таблицы А[/quote]


[quote автор]Процедура_Тест

1. Получаю список данных из таблицы А
2. Беру первый элемент из таблицы
3. Смотрю если первый элемент есть в истории таблицы А
4. Если нету, добавляю его туда
5. Если есть, беру следующий элемент из таблица A -> элемент B
6. И так до тех пор пока все данные из таблицы А не будут в истории таблицы А

И так по кругу в случае с последним элементом -> E, если я его вижу что он уже есть в истории таблицы А, получаю опять первый элемент -> из таблица А.
6 ноя 15, 13:05    [18377849]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Glory
Member

Откуда:
Сообщений: 104751
Brian Kernighan
Да, я не могу написать правильно SELECT.

Тогда прчитайте Рекомендации по оформлению сообщений.

Brian Kernighan
1. Получаю список данных из таблицы А
2. Беру первый элемент из таблицы
3. Смотрю если первый элемент есть в истории таблицы А
4. Если нету, добавляю его туда
5. Если есть, беру следующий элемент из таблица A -> элемент B
6. И так до тех пор пока все данные из таблицы А не будут в истории таблицы А

Это все делается одним запросом

insert into B select from A where not exits(select from b where a.элемент=b.элемент)
6 ноя 15, 13:09    [18377883]     Ответить | Цитировать Сообщить модератору
 Re: Ротация данных  [new]
Brian Kernighan
Member

Откуда:
Сообщений: 5
Спасибо Glory, это приблизительно то что мне нужно, дальше я додумаю сам.
6 ноя 15, 13:34    [18378126]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить