Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Открыть новую тему     Написать ответ в эту тему

ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff
алгоритм примерно такой
1. вставить всё из таблицы 1 в новую таблицу
добавится
data, value1, null
2. проапдейтить новую таблицу значениями из 2й таблицы (по дате, те которые найдутся)
станет
data, value1, value2
3. вставить всё, что не нашлось из таблицы 2 в новую таблицу
добавится
data, null, value2

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 17:33 03-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
да, но я в результате получу
 
data            v1      v2
01.01.2012  10       1
01.05.2012  15      null
01.07.2012  null      3
 
и для того чтобы узнать данные в последней строке нужно будет откатываться по временной шкале назад на неопределённое количество строк
 
Да, и я наверное неправильно выразился.. Под новой таблицей я не имел ввиду физическую табличку (хотя может и она подойдет). Скорее таблица как результат работы запроса или ХП.

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 17:51 03-10-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff
 
select value1, value2 from table1
union  
select value1, value2 from table2
union  
select value1, value2 from table3
 
А чтобы избавиться от  Null, тут ХП-шкой надо пробегать по результатам этого селекта и в локальных переменных "накапливать" значения на определенную дату.
Дата сменилась - делаем SUSPEND в процедуре.
 
Но торvознуто будет на больших данных.
Лучше изначально сделать одну таблицу и заполнять ее тригерами при изменении исходных table1, table2...

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 18:14 03-10-2012
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
очень быстрое решение, могу и ошибиться, проверить не на чем

Код:
 
select  
tabledt.dt,
(select value1 from table1 where data1 = tabledt.dt),
(select value2 from table2 where data2 = tabledt.dt)
from (select data1 as dt from table1 union select data2 as dt from table 2) as tabledt
 

Всего записей: 986 | Зарегистр. 30-05-2002 | Отправлено: 18:14 03-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich
честно, не понял как воспользоваться этим запросом с union'ами
 
noisy
когда поле с данными в этих таблицах только одно, то хорошо. А если полей с десяток?
 

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 18:30 03-10-2012 | Исправлено: druff, 18:30 03-10-2012
ant0ni02004

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff

Цитата:
нужно будет откатываться по временной шкале назад

я не совсем неправильно понял чего хотелось
это лучше хранимой процедурой делать с итерацией по дням (365 раз на год - пустяки)
а еще лучше сводной таблицей. места на винте сейчас много и дешево

Всего записей: 442 | Зарегистр. 26-10-2004 | Отправлено: 20:05 03-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ant0ni02004
таблиц для соединения просто очень много.
 
для каждого лицевого счёта есть с десяток таблиц, каждая со своей историей. Для того чтобы сделать расчёт этому лиц. счёту,  нужно разбить месяц на отрезки, в которых гарантировано не происходило изменений данных лиц. счёта (которые хранятся в разных таблицах).
 
т.е. получить эту самую сводную табличку с информацией
с 1 января площадь квартиры была 20м2, количество проживающих 2чел, показания счётчика 17м3  
с 15 января всё то же самое, но количество проживающих - 3.  
 
и т.д. Только параметров и таблиц гораздо больше.

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 20:48 03-10-2012
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff
Может проще структуру БД пересмотреть ?

Всего записей: 986 | Зарегистр. 30-05-2002 | Отправлено: 21:59 03-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy
хранить всё в одной таблице? Если серьёзно, то я стараюсь упростить схему. Но правила нормализации никто не отменял ) Хранить свойства совершенно разных объектов (справочник тарифов, справочник абонентов, список услуг у этих абонентов и т.д. ) в одной таблице?

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 22:56 03-10-2012 | Исправлено: druff, 22:56 03-10-2012
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
table1 с полями value1_1, value1_2, .. value1_N, date_start1  
 table2 с полями value2_1, value2_2, .. value2_N, date_start2

Это справочник?
сложно судить о БД по двум строкам.
но эти строки явно показывают что было выбрано удобство отображения данных на клиенте, а не обработки данных
 
ведь с таблице вида
дата - тип - значение
проще работать на стороне сервера чем с таблицей
дата - значение1 - значение2 - ... - значениен

Всего записей: 986 | Зарегистр. 30-05-2002 | Отправлено: 09:17 04-10-2012
exteris

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
execute block
returns (date_start date, value1 integer, value2 integer)
as
begin
   for select distinct date_start1
   from table1
   union
   select distinct date_start2
   from table2
   order by 1
   into :date_start
   do begin
      select value1_1
      from table1
      where date_start1=:date_start
      into :value1;
 
      select value2_1
      from table2
      where date_start2=:date_start
      into :value2;
 
      suspend;
   end
end
 

Всего записей: 382 | Зарегистр. 14-04-2003 | Отправлено: 09:31 04-10-2012 | Исправлено: exteris, 09:31 04-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exteris
в принципе да, жизненно, у меня сейчас похожим образом происходит, только в цикле нужно такие запрос поставить (дата, которая есть в первой таблице, может отсутствовать во второй и наоборот)
 

Код:
   do begin  
      select first 1 value1_1  
      from table1  
      where date_start1 <= ate_start  
      order by date_start1 desc
      into :value1;  
 
      select first 1 value2_1  
      from table2  
      where date_start2 <= ate_start  
      order by date_start2 desc
      into :value2;  
 
      suspend;  
   end  

 
 
Добавлено:
noisy
ага, справочники.  
 
пусть, например, table1 будет справочником тарифов, с полями дата_изменения, код_услуги, код_поставщика, код_продавца, код_тарифной_группы, значение_тарифа1, значение_тарифа2...
 
таблица2 пусть будет справочником социальных норм с полями дата_изменения, код_благоустройства, код_услуги, величина_нормы1, величина_нормы2..
 
таблица3 это справочник благоустройств, со своими кодами и расписанием работы..
 
таблица4 это список "векторов" для расчёта у конкретного абонента, с кодами поставщиков, услуг, благоустройств и тоже со своими датами
 
и т.д. Таких таблиц с десяток. Закладываться в начале разработки на то, чтобы таблица была одна - невозможно максимум что я могу сделать, это собирать всё в одну таблицу с помощью триггеров. Хотя не уверен, стоит ли..

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 11:12 04-10-2012 | Исправлено: druff, 11:35 04-10-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff
"пусть, например, table1 будет справочником тарифов, с полями дата_изменения,"
 
Очень советую переделать "дата_изменения" в справочниках на "период действия". типа так:
 
дата_начала_действия   дата_конца действия   значения
01.01.2012                    05.05.2012                500
06.05.2012                    30.09.2012                550
01.10.2012                    01.01.2100                700     ----    Это текущий действующий
 
Тогда не надо будет "чтобы узнать данные в последней строке нужно будет откатываться по временной шкале назад на неопределённое количество строк".
 
Любой действующий параметр можно будет получить через WHERE _date between DateBegin and DateEnd.
 
А если есть только "дата_введения_в_действие", то без перебора истории в цикле никак.

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 12:04 04-10-2012
druff

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexPetrovich
для итоговой таблицы с интервалами я так и хочу сделать. В справочниках будет сложнее. Пользователь ничего не знает о дате окончания и её нужно формировать автоматически, значит лишняя нагрузка на сервер..
 
Добавлено:
AlexPetrovich
да, и по какому алгоритму объединять справочники, если хранить дату начала и дату конца?

Всего записей: 402 | Зарегистр. 14-11-2006 | Отправлено: 13:10 04-10-2012
noisy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
druff
А пользователю и не нужно знать дату окончания.
он сказал новый тариф с такого-то числа.  
а дату окончания предыдущего тарифа легко заменить на (дата начала нового - 1 день)
и у каждого тарифа есть дата окончания, и у нового, но она заведомо большая, например 2200 год, но  ни в коем разе не null!
а нагрузка на сервер сводится к одному апдэйте.

Всего записей: 986 | Зарегистр. 30-05-2002 | Отправлено: 15:39 04-10-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть ли какие средства мониторинга БД на случай нарушения целостности. Т.е. возникли какие проблемы у сервера при доступе к БД и немедленно сообщить об этом администратору. Или периодически запускать проверку целостности БД и при ошибках так же немедленно сообщать администратору. Логи смотоеть не всегда есть возможность.

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 16:54 22-10-2012
OXDBA

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlexCoRu
FBDataGuard

Всего записей: 426 | Зарегистр. 19-01-2005 | Отправлено: 17:01 22-10-2012
AlexCoRu

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OXDBA, по-дешевле ничего?

Всего записей: 911 | Зарегистр. 04-09-2003 | Отправлено: 18:21 22-10-2012
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
noisy
Дата окончания избыточна и не нужна
Типичная ошибка новичков в версионных справочниках
Дата - Значение - все что нужно

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 01:05 23-10-2012
AlexPetrovich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuriyRR
Ага, счаз.
 
Приведи пример запроса определения начисленной суммы за услугу, если тариф менялся несколько раз за период ?
А с датой окончания все просто - where "дата_оказания услуги"  between "тариф_дата_начало" and "тариф_дата_конец".

Всего записей: 87 | Зарегистр. 08-05-2003 | Отправлено: 09:55 23-10-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » InterBase и FireBird: вопросы по работе и их решение


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru