Простой запрос

  1. 10 г. назад

    Сел тут писать выгрузка на сайт цен номенклатуры, написал простенький запрос к регистру "ЦеныНоменклатуры", мне нужно вытягивать 2 последних значения и только когда последнее значение меньше предыдущего...
    сейчас логика зашита в коде, а вообще в Oracle я подобное делал с помощью Lag и Lead.
    Есть у кого идеи, как можно только одним запросом реализовать, без циклов и условий в коде?

  2. Срез последних, к нему присоединять таблицу регистра по условию Период1>Период2, затем группировать и брать максимум по периоду - получишь предыдущую цену

    Ответы: (2) (3)
  3. (1) Не взлетит. Предпоследнее значение может быть вчера, а может год назад. Какие периоды укажешь? Причем для разных товаров по-разному же...

  4. 29.09.2014 10:03:16 отредактировано sda553

    (1) с поправочкой Период1>Период2 ИЛИ (Период1=Период2 И Регистратор1>Регистратор2)
    Но, сдается, в цикле будет быстрее им оптимальнее, чем такая конструкция да выбирающая записи за несколько лет. Хотя...

  5. на пальцах плохо объяснять, вот пример:

    ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ТипЦен,
    ЦеныНоменклатуры.Цена КАК ПрошлаяЦена,
    ВложенныйЗапрос.Цена
    ИЗ
    (ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.ТипЦен КАК ТипЦен,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период1,
    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, Номенклатура = &Ном) КАК ЦеныНоменклатурыСрезПоследних
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ЦеныНоменклатуры.Номенклатура
    И ЦеныНоменклатурыСрезПоследних.ТипЦен = ЦеныНоменклатуры.ТипЦен
    И ЦеныНоменклатурыСрезПоследних.Период > ЦеныНоменклатуры.Период

    СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ТипЦен,
    ЦеныНоменклатурыСрезПоследних.Цена) КАК ВложенныйЗапрос
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ВложенныйЗапрос.Номенклатура = ЦеныНоменклатуры.Номенклатура
    И ВложенныйЗапрос.ТипЦен = ЦеныНоменклатуры.ТипЦен
    И ВложенныйЗапрос.Период1 = ЦеныНоменклатуры.Период

    Ответы: (5) (7) (14)
  6. (4) ну так да... А то два периода каких-то сравнивать предложил...

    Ответы: (6)
  7. (5) ну так оно и есть в запросе

  8. (4) похоже лучше в цикле :)

    Ответы: (10)
  9. но суть понял...

  10. -1 Guk

    Гук, ты меня преследуешь? :)

    Ответы: (11)
  11. (7) тут где то ветка была про запросоложество, сходи туда, после нее такие простые запросы смущать не будут

  12. (9) Кстати на ЯПе есть фишка, за определенное количество минусов срабатывает бан. Там этим нацики активно пользуются. Толпой наваливаются, плюс прокси юзают, короче если против них попрешь за час over 700 минусов накидают, и движок отправит тебя в бан без участия модератора. Надеюсь до подобной дыры Андрю не додумается )

    Ответы: (12) (13)
  13. (11)+ Впрочем подозреваю что у комодераторов там просто право есть ставить неограниченное количество минусов, чем и пользуются, чтоб не палиться. По тому что националистических веток там на главной порой до трех штук висит, кто владельцы и модеры в принципи понятно. По сравнению с ними миста просто милая песочница )

  14. 29.09.2014 10:41:34 отредактировано Курильщик

    (11) демократия :) а точнее охлократия

  15. (4) Сдаётся мне, что в результат этого запроса попадут также цены, которые не менялись, но при этом есть хотя бы 2 записи в регистре сведений с разными периодами (с одинаковыми ценами) ...

или зарегистрируйтесь чтобы ответить!