Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Запрос на получение цены последнего прихода : Супермаг Плюс (Супермаг 2000)

28.03.2024 18:06


28.12.2007 10:30
isi
 
Да, по моему от туда и выдрано :)
04.02.2008 09:15
isi
 
Вообщем вот таким запросом можно быстро получить цену последнего прихода очень быстро:

select /*+ FIRST_ROWS(n) */ a.*, ROWNUM rnum
from (
select smdocuments.createdat, smdocuments.id, smdocuments.locationto , smspec.article, smspec.itemprice, smspec.quantity, smspec.totalprice
from smdocuments, smspec
WHERE smspec.doctype = smdocuments.doctype
AND smspec.docid = smspec.docid
AND smspec.article IN ('79290')
AND smdocuments.locationto IN (16)
and smdocuments.docstate in (2,3)
order by smdocuments.createdat desc
) a
where ROWNUM = 1
04.02.2008 09:45
kadr
 
Цитата:
isi Вообщем вот таким запросом можно быстро получить цену последнего прихода очень быстро:
на каких объёмах тестировалось? Быстро - это достаточно абстрактная величина, а если нужно получить последнюю цену для кучи (~10000) артикулов и нескольких МХ тоже быстро отрабатывает?
04.02.2008 10:01
isi
 
На центральной БД в 80 Гигов, запрос возвращает только первую запись, если надо для нескольких то его в место поля, попробуй, я сам удивился производительности, нашел реализацию у Том Кайт тут:
04.02.2008 14:21
kadr
 
Цитата:
select /*+ FIRST_ROWS(n) */ a.*, ROWNUM rnum
from (
select smdocuments.createdat, smdocuments.id, smdocuments.locationto , smspec.article, smspec.itemprice, smspec.quantity, smspec.totalprice
from smdocuments, smspec
WHERE smspec.doctype = smdocuments.doctype

AND smspec.docid = smspec.docid

а это зачем? какой тайный смысл
Цитата:
AND smspec.article IN ('79290')
AND smdocuments.locationto IN (16)
and smdocuments.docstate in (2,3)
order by smdocuments.createdat desc
) a
where ROWNUM = 1
04.02.2008 14:36
kadr
 
исходные данные

Код:
SELECT COUNT(*) FROM smdocuments
3856280
Код:
 select count(*) from smspec
159247539
вот немного переписанный запрос автора
Код:
SELECT /*+ FIRST_ROWS(n) */
 A.*, ROWNUM RNUM
  FROM (SELECT SMDOCUMENTS.CREATEDAT,
               SMDOCUMENTS.ID,
               SMDOCUMENTS.LOCATIONTO,
               SMSPEC.ARTICLE,
               SMSPEC.ITEMPRICE,
               SMSPEC.QUANTITY,
               SMSPEC.TOTALPRICE
          FROM SMDOCUMENTS, SMSPEC
         WHERE SMSPEC.DOCTYPE = SMDOCUMENTS.DOCTYPE
           AND SMDOCUMENTS.ID = SMSPEC.DOCID
           AND SMSPEC.ARTICLE IN ('18500')
           AND SMDOCUMENTS.LOCATIONTO IN (2015)
           AND SMDOCUMENTS.DOCSTATE IN (2, 3)
           AND SMDOCUMENTS.DOCTYPE='WI'
         ORDER BY SMDOCUMENTS.CREATEDAT DESC) A
 WHERE ROWNUM = 1
в период очччень хорошей загрузки базы
от 15 до 200 сек.

Код:
SELECT *
  FROM (SELECT A2.CREATEDAT,
               A2.ID,
               A2.LOCATIONTO,
               B2.ARTICLE,
               B2.ITEMPRICE,
               B2.QUANTITY,
               B2.TOTALPRICE,
               ROW_NUMBER() OVER(PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
          FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
         WHERE A2.DOCTYPE = B2.DOCTYPE
           AND A2.ID = B2.DOCID
           AND A2.DOCSTATE IN (2, 3)
           AND A2.LOCATIONTO IN (2015)
           AND A2.DOCTYPE = 'WI' -- определение последнего поставщика
           AND B2.ARTICLE IN ('18500'))
 WHERE RN = 1
в тот же период
от 0,01 до 5 секунд

P.S. аналитические функции у того же Кайта очень хорошо рассмотрены
04.02.2008 15:53
isi
 
собственно сейчас с аналитическими фнкциями и разбираюсь, базы под рукой нет сейчас, завтра выложу свою статистику, в моем варианте у меня ответ при любых условиях был сравним с реакцией интерфейса при одном но, если был хотя бы один приход по мх+артикул, если же прихода не было, то ответ доходил до 30 сек
04.02.2008 16:27
kadr
 
Цитата:
isi в моем варианте у меня ответ при любых условиях был сравним с реакцией интерфейса при одном но, если был хотя бы один приход по мх+артикул, если же прихода не было, то ответ доходил до 30 сек

1. при использовании интерфейса СМ генерится куча рекурсивных запроосов, значит нам надо стремиться чтобы работало быстрее.

2. если у меня прихода не было, то твой вариант всё-равно выдавал строки
04.02.2008 23:10
mighty
 
Если в конструкцию ROW_NUMBER() OVER (PARTITION BY B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
добавить A2.LOCATIONTO то можно заремить отбор по месту хранения и получать последние закупочные цены по одному товару по всем местам хранения
ROW_NUMBER() OVER (PARTITION BY A2.LOCATIONTO,B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN

И еще важно отсекать оприходование недостачи, то есть добавить условие A2.OPCODE=0

Итого:
SELECT *
FROM (SELECT A2.CREATEDAT,
A2.ID,
A2.LOCATIONTO,
B2.ARTICLE,
B2.ITEMPRICE,
B2.QUANTITY,
B2.TOTALPRICE,
ROW_NUMBER() OVER (PARTITION BY A2.LOCATIONTO,B2.ARTICLE ORDER BY A2.CREATEDAT DESC) RN
FROM SUPERMAG.SMDOCUMENTS A2, SUPERMAG.SMSPEC B2
WHERE A2.DOCTYPE = B2.DOCTYPE
AND A2.ID = B2.DOCID
AND A2.DOCSTATE IN (2, 3)
AND A2.OPCODE=0
-- AND A2.LOCATIONTO IN (2015)
AND A2.DOCTYPE = 'WI' -- определение последнего поставщика
AND B2.ARTICLE IN ('18500'))
WHERE RN = 1
05.02.2008 03:07
isi
 
Ну вот видете вместе получилось довести до ума запрос, который многим начинающим нужен :)
Часовой пояс GMT +3, время: 18:06.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.