[ОТВЕТИТЬ]
01.03.2010 10:41
SMak
 
сам вопрос: подскажите как пооптимальнее взять второе значение (строку) селекта?

задача: взять в ценник предыдущую цену

пока я пришёл к такому:
select * from (
select price from supermag.smpricehistory where article=003576 and pricetype=1 and storeloc=5 order by eventtime desc
) where rownum<3;
или я не тем путём пошёл?
01.03.2010 11:24
OlegON
 
Не задумывался и не проверял, просто выбор диапазона строк, в твоем случае - сужение до одной строки, по Кайту:
Цитата:
select *
from ( select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from ( select price from supermag.smpricehistory where article=003576 and pricetype=1 and storeloc=5 order by eventtime desc ) a
where ROWNUM <= 2 )
where rnum >= 2
01.03.2010 11:35
Mtirt
 
Ценник с двумя ценами делаешь?

Код:
 select ph.price 
					  from supermag.SMPriceHistory ph 
					  where ph.storeloc  = :P_Loc 
					  	and ph.article   = :article 
					  	and ph.pricetype = :P_Price_Type
					  	and round(:qty*ph.price,2) > :price
						  and trunc(sysdate)>=trunc(ph.EventTime) 
						  and rownum=1
			      order by ph.EventTime desc, ph.recid desc
01.03.2010 12:57
SMak
 
результат всё же такой
Код:
select price
from ( select a.*, ROWNUM rnum
from ( 
select price from supermag.smpricehistory where article=003576 and pricetype=1 and storeloc=5 order by eventtime desc, recid desc 
) a
where ROWNUM <= 2 )
where rnum >= 2
а есть смысл в двойном ордере? (order by eventtime desc, recid desc)
01.03.2010 13:00
AirAir
 
Кажется это тебе надо
select * from
(select ph.*,
row_number() over (order by ph.eventtime desc) seq
from supermag.smpricehistory ph
Where ph.pricetype = 1 and
ph.article = 005160 and ph.storeloc = 3)
Where seq = 2
01.03.2010 13:04
AirAir
 
Напиши - подошло/нет
01.03.2010 13:08
kadr
 
Цитата:
SMak результат всё же такой
Код:
select price
from ( select a.*, ROWNUM rnum
from ( 
select price from supermag.smpricehistory where article=003576 and pricetype=1 and storeloc=5 order by eventtime desc, recid desc 
) a
where ROWNUM <= 2 )
where rnum >= 2
а есть смысл в двойном ордере? (order by eventtime desc, recid desc)
Конечно есть, в таблице допускаются строки с одним и тем же временем исполнения, поэтому дополнительно надо и по номеру записи сортировать
03.03.2010 17:48
SMak
 
немного запутался
изменяю ценник от Mihonа
он получает данные от:
Код:
supermag.russianspell.LoadPriceCard(:P_COPIES, :P_ARTICLE, :P_IDCLASS, :P_DOC_TYPE, :P_DOC_ID, :P_LOC, :P_PRICE_TYPE, :P_NAME,
:P_Qty, :P_Type, 0, 1);
+ у меня есть вышеобсуждаемый запрос предыдущей цены (передай артикул - получишь цену)
а как мне это теперь красиво объединить в сам ценник?
03.03.2010 20:19
vdm
 
LoadPriceCard заполняет пару временных таблиц (TTPriceCard, TTPriceCard1)
Из них берет данные основной запрос (Модель данных - Запросы)

У тебя 2 варианта:
1) добавить в основной запрос свой подзапрос (объединить в 1), получишь новый столбец в модели данных, который используешь в разметке.
2) см. в том ценнике поле composition и делай аналогично. Будет выполняться отдельный подзапрос на каждый артикул.
04.03.2010 19:11
SMak
 
спасибо, пошёл по второму варианту...
и снова споткнулся :(

сделал поле аналогичное composition, пишу функцию:
Код:
function Price_oldFormula return Char is
rtrn char(250);
begin
	select price into rtrn
	from ( select a.*, ROWNUM rnum
			from (select price from supermag.smpricehistory where ((article=:ARTICLE)
		 		and (pricetype=:P_PRICE_TYPE)
		 		and (storeloc=:P_LOC))
				order by eventtime desc, recid desc) a
		where ROWNUM <= 2 )
	where rnum >= 2;
  if rtrn is null then
  	return ' ';
  else
    return rtrn;
  end if;
end;
пытаюсь компильнуть, выдаёт ошибку (103), что вместо order ожидается что-то другое
при копировании запроса в тоад - выполняется нормально...
и ещё, я правильно подставил переменные? :ARTICLE по аналогии, а две других как-бы из формы, они нормально сюда встают?
05.03.2010 12:03
vdm
 
Reports 6 - древняя штука.
И order by в подзапросах, и аналитику в статическом sql не понимает.

Тут можно посчитать строки вручную.
Код:
function CF_Price_oldFormula return Char is
  rn pls_integer;
begin
	rn := 1;	
	for c in (  select price 
		  from supermag.smpricehistory
		where article = :ARTICLE
		    and pricetype = :P_PRICE_TYPE
		    and storeloc = :P_LOC
		order by eventtime desc, recid desc
		)	
	loop
		if rn = 2 then return c.price;
		end if;
		rn := rn + 1;
	end loop;
 	return '';  
end;
А вот по варианту 1 - должно работать все.
Опции темы


Часовой пояс GMT +3, время: 14:59.

 

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