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

Откуда:
Сообщений: 193
Доброго времени суток. Задача такова:
Данные о человеке находятся в трех таблицах по частям (А,В,С). При изменении сведений об этом человеке изменения и время изменения попадают соответственно в таблицы (А1,В1,С1) при этом изменения вносятся только в ту таблицу которой они непосредственно касаются.
Порядок действий:
1)Создали нового человека
2)Внесли изменения касающиеся таблицы В1
3)Внесли изменения касающиеся таблицы С1
4)Внесли изменения касающиеся таблицы В1
5)Внесли изменения касающиеся таблицы А1

Мне нужно объединив эти три таблицы получить таблицу с пошаговыми действиями над этим человеком:

К примеру:
A1
13:08:21
13:14:07
B1
13:08:21
13:10:38
13:13:35
C1
13:08:21
13:12:25

Итог:
13:08:21+13:08:21+13:08:21
13:08:21+13:10:38+13:08:21
13:08:21+13:10:38+13:12:25
13:08:21+13:13:35+13:12:25
13:14:07+13:13:35+13:12:25

Не могу никак понять как их правильно их объединить.
12 май 15, 14:52    [17628981]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Добрый Э - Эх
Guest
RuslanSharipov,

юзабильный набор репрезентативных тестовых данных, желаемый вид результата на них повысило бы шанс на более полный и правильный ответ.
А так, видbтся, что тебе нужен FULL JOIN по нумерованным row_number-ом таблицам с протяжкой результатов...
12 май 15, 15:03    [17629062]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Ну к примеру: Пришел новый клиент и мы записали данные о нем в нашу базу таким образом что в таблице А хранится фамилия, В-имя, С-Отчество. При этом у нас есть так сказать логи (А1, В1, С1) в которых хранятся изменения и время изменений. Записали мы его как Иванов Иван Иванович:
Содержимое таблиц:
А-Иванов
В-Иван
С-Иванович
А1-Иванов 12.05.2015
В1-Иван 12.05.2015
С1-Иванович 12.05.2015
Затем 13.05.2015 мы изменили данные на Иванов Иван Сидорович, тогда содержимое таблиц:
А-Иванов
В-Иван
С-Сидорович
А1-Иванов 12.05.2015
В1-Иван 12.05.2015
С1-Иванович 12.05.2015, Сидорович 13.05.2015
Поменяли 14.05.2015 на Петров Иван Сидорович
А-Петров
В-Иван
С-Сидорович
А1-Иванов 12.05.2015, Петров 14.05.2015
В1-Иван 12.05.2015
С1-Иванович 12.05.2015, Сидорович 13.05.2015
и т.д.
Нам необходимо просмотреть всю цепочку изменений по этому клиенту
12 май 15, 15:11    [17629117]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Cygapb-007
Member

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

declare @A1 table (id int identity primary key, tm time);
insert @A1 (tm) values ('13:08:21'),('13:14:07');

declare @B1 table (id int identity primary key, tm time);
insert @B1 (tm) values ('13:08:21'),('13:10:38'),('13:13:35');

declare @C1 table (id int identity primary key, tm time);
insert @C1 (tm) values ('13:08:21'),('13:12:25');

select row_number()over(order by (select 1))npp
  , *
  , max(iif(typ='a',tm,null))over(order by tm,typ)a
  , max(iif(typ='b',tm,null))over(order by tm,typ)b
  , max(iif(typ='c',tm,null))over(order by tm,typ)c
from (
  select 'a' typ, tm from @A1
  union all
  select 'b' typ, tm from @B1
  union all
  select 'c' typ, tm from @C1
  )u
order by u.tm, u.typ
npptyptmabc
1a13:08:21.00013:08:21.000NULLNULL
2b13:08:21.00013:08:21.00013:08:21.000NULL
3c13:08:21.00013:08:21.00013:08:21.00013:08:21.000
4b13:10:38.00013:08:21.00013:10:38.00013:08:21.000
5c13:12:25.00013:08:21.00013:10:38.00013:12:25.000
6b13:13:35.00013:08:21.00013:13:35.00013:12:25.000
7a13:14:07.00013:14:07.00013:13:35.00013:12:25.000
12 май 15, 15:15    [17629146]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Cygapb-007, я наверное не совсем правильно сформулировал задачу в первый раз. Есть идеи как реализовать то что было написано после этого?
12 май 15, 15:39    [17629357]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Добрый Э - Эх
Guest
RuslanSharipov
Cygapb-007, я наверное не совсем правильно сформулировал задачу в первый раз. Есть идеи как реализовать то что было написано после этого?
ещё раз:
Я же
юзабильный набор репрезентативных тестовых данных, желаемый вид результата на них
при этом не гнушись использовать теги SRC (для выделения кода) и CSV (для формирования внешнего вида входных и выходных данных).
А то об твои сообщения глаз ломается, что напрочь отбивает желание даже пытаться понять, чего тебе надо, не говоря уже о том, чтобы предлагать какие-нибудь готовые решения.
12 май 15, 15:45    [17629407]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

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

Задача не сформулирована не только в первый, но и во второй раз.

Ищите "хранение исторических данных в реляционных базах данных".
12 май 15, 15:47    [17629433]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193


К сообщению приложен файл. Размер - 35Kb
12 май 15, 16:14    [17629656]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Glory
Member

Откуда:
Сообщений: 104751
RuslanSharipov
Картинка с другого сайта.

https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume п.4 и п.6
12 май 15, 16:18    [17629681]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

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

Примерно так:
select нужные столбцы
  from A a
  join B b on b.Id_Customer=a.Id_Customer
  join C c on c.Id_Customer=a.Id_Customer
 where  a.Id_Customer=2
 order by b.Date_modify, c.Date_modify;
12 май 15, 16:39    [17629846]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Glory, п.4 версия Sql Server здесь роли никакой не играет, а таблицы связаны как можно догадаться по Id_Customer, данные о клиенте делятся на части и записываются в три соответствующие таблицы, те таблицы которые я предоставил это логи изменений запись в которые осуществляется при каждом изменении данных(таким образом что если изменились данные к примеру только о ФИО запись пойдет только в соответствующую таблицу чтобы не дублировались одинаковые записи(так как изменения в них не произошли) в других. Как еще подробней объяснить? Вроде задача объяснена доходчиво.
12 май 15, 16:40    [17629852]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Wlr-l, в данном случае он просто умножит все данные трех таблиц а не выведет последовательную цепочку изменений
12 май 15, 16:41    [17629866]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Glory
Member

Откуда:
Сообщений: 104751
RuslanSharipov
Glory, п.4 версия Sql Server здесь роли никакой не играет,

Послушайте, если вы сюда пришли за решением проблемы, то делайте то, что вам говорят, и так, как вам говорят
12 май 15, 16:43    [17629882]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Glory, мне не нужен готовый код, мне нужен алгоритм как я могу это реализовать-какое условие по Date_Modify поставить или где что сравнить и т.п.
12 май 15, 16:47    [17629907]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
RuslanSharipov
Wlr-l, в данном случае он просто умножит все данные трех таблиц а не выведет последовательную цепочку изменений


Посмотрите, что получится. А доработать до нужного вам вывода, будет домашним заданием.

Версия сервера важна, так как можно использовать разные возможности, например, оконные функции, как это уже было продемонстрировано.
12 май 15, 16:51    [17629931]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
RuslanSharipov
Glory, мне не нужен готовый код, мне нужен алгоритм как я могу это реализовать-какое условие по Date_Modify поставить или где что сравнить и т.п.



Вкурите вот эту тему

http://en.wikipedia.org/wiki/Slowly_changing_dimension

Когда разберётесь с ней, вкурите вот эту

http://en.wikipedia.org/wiki/Data_Vault_Modeling
12 май 15, 16:56    [17629956]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21243
Соберите дату и время из всех трёх таблиц. Затем к полученной таблице привязывайте все три таблицы по минимуму неположительного отклонения времени.
12 май 15, 17:00    [17629972]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Wlr-l
Посмотрите, что получится. А доработать до нужного вам вывода, будет домашним заданием.

Вы просто взяли и умножили три таблицы. результат будет таков что каждая запись первой таблицы умножиться на каждую запись из других в результате просто непонятный набор данных.
Версия сервера важна, так как можно использовать разные возможности, например, оконные функции, как это уже было продемонстрировано.


Sql Server 2008
12 май 15, 17:01    [17629982]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

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

Вам уже прямо сказали, что "юзабильный набор репрезентативных тестовых данных повысило бы шанс на более полный и правильный ответ".

Приведите скрипт создания таблиц, скрипт заполнения этих таблиц тестовыми данными. И вам предложат несколько вариантов.

Пока что, одни туманные размышления об алгоритме, умножении таблиц и совсем туманные знания нормализации. А здесь нужно работать пальчиками.
12 май 15, 17:11    [17630032]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

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

Здесь все гораздо проще!
12 май 15, 17:15    [17630056]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Akina, спасибо
12 май 15, 17:16    [17630067]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Wlr-l
a_voronin,

Здесь все гораздо проще!


Здесь несколько сущностей версионируются параллельно. Можно костыли вертеть. А можно по уму сделать.

Если TC виртуоз в оконных функциях можно и налету попробовать собрать. Я бы начал от списка уникальных дат по человеку, по которым есть изменения, от них JOIN по дате и коду человека на остальные таблицы.
12 май 15, 17:31    [17630158]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Cygapb-007
Member

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

на 2008 я б курсор зарядил
и в цикле (можно и в одной транзакции) добавлял бы полные триады обновлений с обвязкой данными из рабочих таблиц
12 май 15, 17:39    [17630217]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
RuslanSharipov
Member

Откуда:
Сообщений: 193
Решено. Всем спасибо, тема закрыта.
12 май 15, 17:54    [17630330]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм  [new]
Wlr-l
Member

Откуда:
Сообщений: 601
a_voronin

Здесь несколько сущностей версионируются параллельно. Можно костыли вертеть. А можно по уму сделать.

Если TC виртуоз в оконных функциях можно и налету попробовать собрать. Я бы начал от списка уникальных дат по человеку, по которым есть изменения, от них JOIN по дате и коду человека на остальные таблицы.


У ТС можно сказать сделано по уму: данные нормализованы, история изменений хранится. Осталось сделать простенький отчет для просмотра цепочки изменений по заданному клиенту.

Ваше предложение и предложение от Akina эквивалентны. Я ожидал от ТС вопрос "Как найти минимум неположительного отклонения времени". Очевидно, он справился с этой задачей самостоятельно.

Предложу такое решение без использования вычисления "минимума неположительного отклонения времени", оконных функций и курсоров (не для ТС, для него тема уже закрыта):
declare @idCustomer int = 2;

with A as (
  select *
    from (values (2,'Ivanov', 'Ivan', '20150101', 'new')
         )   as T(idCustomer, F, I, dateModify, state)
)

, B as (
  select *
    from (values (2, 'Ivanov', 'Ivan', '20150101', 'new'),
                 (2, 'Ivanoff','Ivan', '20150110', 'cha'),
                 (2, 'Ivanov', 'Ivan', '20150118', 'cha')
         )   as T(idCustomer, F, I, dateModify, state)
)

, C as (
  select *
    from (values (2, 10, '20150101', 'new'),
                 (2, 12, '20150110', 'cha'),
                 (2, 15, '20150115', 'cha')
         )   as T(idCustomer, idManager, dateModify, state)
)

select a.F as FA, a.I as IA, b.F as FB, b.I as IB, c.idManager, a.dateModify, a.state, 'A' as tbl
  from A a
  join B b on b.idCustomer=a.idCustomer and b.state='new'
  join C c on c.idCustomer=a.idCustomer and c.state='new'
 where a.idCustomer=@idCustomer
union all
select '', '', F, I, null, dateModify, state, 'B'
  from B
 where idCustomer=@idCustomer and state='cha'
union all
select '', '', '', '', idManager, dateModify, state, 'C'
  from C
 where idCustomer=@idCustomer and state='cha'
 order by dateModify,tbl;

Результат:
FA	IA	FB	IB	idManager	dateModify	state	tbl
Ivanov Ivan Ivanov Ivan 10 20150101 new A
Ivanoff Ivan NULL 20150110 cha B
12 20150110 cha C
15 20150115 cha C
Ivanov Ivan NULL 20150118 cha B

В первой строке собираются данные, которые были внесены при первой вставке, а в остальных только изменения. Одновременно решена задача подавления повторяющихся значений (на уровне отдельных таблиц).
13 май 15, 11:36    [17632966]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить