|
Запросик 2....
|
|||
---|---|---|---|
#18+
Мыслители! Есть большая необходимость написать следующее. 1. Есть таблица с товарами product(product_id). 2. Есть таблица со сводным движением товаров, предположим move (product_id, date, product_move). 3. Есть таблица с текущими остатками товаров stock(product_id, stock_count). Задача: нужно посчитать количество дней с положительным остатком, например, за последний месяц... Как это лучше реализовать, или может кто-нибудь с подобным сталкивался?... Нужен один select. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 11:58 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
я бы предпочёл (в добавок к написаному) увидеть и SQL statements создания табличек с primary/foreign keys definition - как-то привычнее, что ли.... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 12:07 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
create table product (product_id bigint not null generated always ......, ....... PRIMARY KEY (product_id) ) ................ create table move (product_id bigint not null, date date not null, move double not null PRIMARY KEY (product_id, date), FOREIGN KEY (product_id) REFERENCES PRODUCT (PRODUCT_ID) ) ................ create table stock (product_id bigint not null, stock_count double not null PRIMARY KEY (product_id), FOREIGN KEY (product_id) REFERENCES PRODUCT (PRODUCT_ID) ) ................ что-то вроде этого.... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 12:15 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
а теперь, если можно, логику. Бизнесс логику. Ну то есть как товары двигаються. Ну то есть, как связаны между собой такие действия, как внесение записи в table move and table stok. Я так понимаю, что при внесении записи в move, надо делать изменение записи в stok. sorry for disturbing ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 12:48 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Таблица move показывает общее операционное движение товара за день, ее на самом деле нет. Есть несколько таблиц, в которых хранятся все приходы и расходы товаров. При изменении этих таблиц изменяется таблица с остатками. То есть физически есть таблица, которая содержит текущие(последние) значения остатков товаров и есть таблицы, в которых содержится все движение товаров. Идеи, которые приходят в голову... Остатки на даты насчитывать либо с первоначальной даты (остаток = все приходы - все расходы по товару до определенной даты), либо идти от текущей даты (остаток = все расходы - все приходы). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 12:57 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Код: plaintext 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.
типа того... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 13:36 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Чего такое: sum(move) over(partition by product_id order by product_id,date) as decimal(17,2)) ???? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 13:42 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
И еще одно маленькое уточнение, которое возможно все и портит. В таблице move если движения по товару не было - нет записи.... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 13:57 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
TORTИ еще одно маленькое уточнение, которое возможно все и портит. В таблице move если движения по товару не было - нет записи.... ну и что? ... можешь разницу в днях между записями посчитать - типа сколько дней продержался остаток без движения... Захочешь - выкрутишься ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:26 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
млин... Я уже написал запрос... Без OLAP-функций....Он даже правильно считает.:).. Только не устраивает скорость запроса и стоимость (~2.5 млн. в моем варианте). Нужно ускорить...Поэтому ищу технологии, может кто сталкивался с подобным..... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:30 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
обычно остатки для этого уже хранят в посчитанном виде, а не считают... или по крайней мере обороты. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:36 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Если держать таблицу с остатками/оборотами, то накладно получается..... Количество товаров * количество дат * количество предприятий = Слишком много, и причем растет быстро... Разве это выход? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:41 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Подсчет оборотов дает стоимость (~8,5 тыс).... Ну можно посторить MQT для них, наверняка это увеличит скорость... У меня основной затуп идет, когда пытаюсь собрать в подзапросе таблицу (product_id, date) для всех дат и товаров.... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:43 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
у Николая есть бесподобная презентация Unleashed SQL. Это второй must read после CookBook для каждого, кто должен писать что-нибудь сложнее select * from table в DB2 Ну а по поводу "накладно получается" - кто строит дизайн, тому и решать. Сравнивай. Скорость выполнения запроса, стоимость дискового пространства. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 14:55 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Действительно, сейчас посмотрел-подумал... да... ОЛАП функции не катят для того, что тебе нужно. Но на С/С++ такую фишку действительно можно написать. Конечно - интересная, нетривиальная задача. Пусть у нас есть упорядоченные записи: 1 01.01.2005 0 2 05.01.2005 4 3 15.01.2005 10 4 17.01.2005 2 5 28.01.2005 11 Вот это 3-е дурацкое поле является разницей между днями в предыдущей и текущей строками. А отсортировав эту выборку в обратном направлении, и применив ту же функцию, мы действительно получим - типа сколько дней действовал каждый остаток. 5 28.01.2005 0 4 17.01.2005 11 3 15.01.2005 2 2 05.01.2005 10 1 01.01.2005 4 Офигительно!... по-моему ОЛАП ф-ции этого не умеют.... но на С++ такое поведение реализовать (такую ф-цию) - как два пальца! ... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 16:14 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
Идея хорошая...... А дальше можно получить 1 или 0 в смысле был остаток на эту дату или нет, а потом перемножить 1 или 0 на 3 параметр.... Просуммировав получим число дней с остатком???? Правильно мыслю? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 16:23 |
|
Запросик 2....
|
|||
---|---|---|---|
#18+
А самое главное не надо для всех товаров держать все даты, а это уже сокращает стоимость на несколько порядков...... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2005, 16:27 |
|
|
start [/forum/topic.php?fid=43&msg=33072794&tid=1605898]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
113ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 293ms |
total: | 497ms |
0 / 0 |