|   |   | 
| 
 | Выбрать по две последние записи по всем измерениям РС запросом | ☑ | ||
|---|---|---|---|---|
| 0
    
        Nikoss 16.05.13✎ 14:22 | 
        Есть периодичный регистр:
  Изм: Номенклатура Рес: Количество Допустим будут такие данные: 1.01 _ Ручка _ 14 1.01 _ Ручка _ 3 1.01 _ Карандаш _ 2 2.01 _ Ручка _ 7 2.01 _ Карандаш _ 3 3.01 _ Ручка _ 4 4.01 _ Ластик _ 1 4.01 _ Ручка _ 11 5.01 _ Ластик _ 2 Как выбрать по две записи каждой номенклатуры? Т.е. чтобы было так: 3.01 _ Ручка _ 4 4.01 _ Ручка _ 11 1.01 _ Карандаш _ 2 2.01 _ Карандаш _ 3 4.01 _ Ластик _ 1 5.01 _ Ластик _ 2 | |||
| 1
    
        LehhaK 16.05.13✎ 14:23 | 
        А что не получается?     | |||
| 2
    
        Nikoss 16.05.13✎ 14:28 | 
        (1) ну я могу взять срез последних на дату, но этот же срез будет только по 1 штуке, как до второй добраться?     | |||
| 3
    
        sda553 16.05.13✎ 14:28 | 
        Идея такая (как выбрать вторые по истории), дальше сам думай:
  Выбрать Период КАК НеМаксПериод, Измерение Из Регистр.МойРегистр Немаксимумы ЛЕВОЕ СОЕДИНЕНИЕ ( Выбрать Максимум(Период) КАК МаксПериод, Измерение Из Регистр.МойРегистр СГРУППИРОВАТЬ ПО Измерение ) Максимумы По Максимумы.Период>Немаксимумы.Период И Максимумы.Измерение = НеМаксимумы.Измерение | |||
| 4
    
        LehhaK 16.05.13✎ 14:29 | 
        Бери не срез. Бери весь регистр, сортируй по дате, выбирай первые 2. Должно прокатить ( я когда то давно на ценник выводил 2 цены, чтоб 1 зачеркивать, типа акция)     | |||
| 5
    
        Sensodin 16.05.13✎ 14:30 | 
        СрезПредпоследних     | |||
| 6
    
        LehhaK 16.05.13✎ 14:31 | 
        На вот:
  ЗапросПредыдущаяЦена = Новый Запрос;
  | |||
| 7
    
        sda553 16.05.13✎ 14:38 | 
        (6) неправильно     | |||
| 8
    
        LehhaK 16.05.13✎ 14:40 | 
        (7) работает     | |||
| 9
    
        samozvanec 16.05.13✎ 14:41 | 
        (8) ты так всего 2 записи получишь. а надо в разрезе измерений     | |||
| 10
    
        sda553 16.05.13✎ 14:41 | 
        (8) Не сомневаюсь но выдает две строки, которые не имеют никакого отношения к тому, что нужно ТС     | |||
| 11
    
        LehhaK 16.05.13✎ 14:42 | 
        (9) он спросил, как получить 2 последние записи. я ответил. В разрезе измерений запилит поди сам     | |||
| 12
    
        samozvanec 16.05.13✎ 14:43 | 
        (11) ну да, там всего-то 
  |ГДЕ | ЛОЖЬ дописать | |||
| 13
    
        sda553 16.05.13✎ 14:43 | 
        (11) Не поверишь, но 
  1. "запиливание под разрез измерений" - это собственно самая главная задача, 2. Твой запрос не выбирает две последние записи в общем случае | |||
| 14
    
        Fragster гуру 16.05.13✎ 14:43 | 
        Что-то типа
  Выбрать * Из регистр где Регистр.Период, Регистратор в (Выбрать Первые 2 Период, Регистратор Из Регистр Как РегистрВложенный Где РеигстрВложенный.Измерения = Регистр.Измерения Упорядочить по РегистрВложенный.Период Убыв) | |||
| 15
    
        sda553 16.05.13✎ 14:44 | 
        (14) Нет, то же неправильно.     | |||
| 16
    
        Fragster гуру 16.05.13✎ 14:46 | 
        (15) почему?     | |||
| 17
    
        LehhaK 16.05.13✎ 14:46 | 
        (13) в (2) написано не так. Впрочем, у тебя полоска длиннее - ты советуй :)     | |||
| 18
    
        sda553 16.05.13✎ 14:47 | 
        (17) Я уже посоветовал в (3) - правда там с ошибками, лень исправлять, но набросок представление о решении дает     | |||
| 19
    
        sda553 16.05.13✎ 14:49 | 
        (16) Потому что в 1С нельзя из вложенных запросов обращаться к невложенным.     | |||
| 20
    
        Fragster гуру 16.05.13✎ 14:50 | 
        (19) бугага!     | |||
| 21
    
        ProgAL 16.05.13✎ 14:53 | 
        ВЫБРАТЬ
  КурсыВалют.Валюта КАК Валюта, МАКСИМУМ(КурсыВалют.Период) КАК Период ПОМЕСТИТЬ ВТПоследнихДат ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Период <= &Период СГРУППИРОВАТЬ ПО КурсыВалют.Валюта ИНДЕКСИРОВАТЬ ПО Валюта, Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КурсыВалют.Валюта КАК Валюта, МАКСИМУМ(КурсыВалют.Период) КАК Период ПОМЕСТИТЬ ВТДат ИЗ ВТПоследнихДат КАК ВТПоследнихДат ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО (КурсыВалют.Валюта = ВТПоследнихДат.Валюта) И (КурсыВалют.Период < ВТПоследнихДат.Период) СГРУППИРОВАТЬ ПО КурсыВалют.Валюта ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВТПоследнихДат.Валюта, ВТПоследнихДат.Период ИЗ ВТПоследнихДат КАК ВТПоследнихДат ИНДЕКСИРОВАТЬ ПО Валюта, Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТДат.Валюта КАК Валюта, ВТДат.Период КАК Период, КурсыВалют.Курс ИЗ ВТДат КАК ВТДат ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ВТДат.Валюта = КурсыВалют.Валюта И ВТДат.Период = КурсыВалют.Период УПОРЯДОЧИТЬ ПО Валюта, Период | |||
| 22
    
        ProgAL 16.05.13✎ 14:54 | 
        А дальше воспользоваться великой силой аналогии.     | |||
| 23
    
        Fragster гуру 16.05.13✎ 14:57 | 
        вот это работает (самописька, для себя переписать несложно):
  ВЫБРАТЬ ЦеныНоменклатуры.Период КАК Период, ЦеныНоменклатуры.Регистратор, ЦеныНоменклатуры.НомерСтроки, ЦеныНоменклатуры.Активность, ЦеныНоменклатуры.Номенклатура КАК Номенклатура, ЦеныНоменклатуры.ТипЦен КАК ТипЦен, ЦеныНоменклатуры.Качество КАК Качество, ЦеныНоменклатуры.Цена, ЦеныНоменклатуры.Валюта, ЦеныНоменклатуры.ЕдиницаИзмерения, ЦеныНоменклатуры.ЦенаВключаетНДС ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ГДЕ ЦеныНоменклатуры.Период В (ВЫБРАТЬ ПЕРВЫЕ 2 РегистрВложенный.Период ИЗ РегистрСведений.ЦеныНоменклатуры КАК РегистрВложенный ГДЕ РегистрВложенный.Номенклатура = ЦеныНоменклатуры.Номенклатура И РегистрВложенный.ТипЦен = ЦеныНоменклатуры.ТипЦен И РегистрВложенный.Качество = ЦеныНоменклатуры.Качество УПОРЯДОЧИТЬ ПО РегистрВложенный.Период УБЫВ) УПОРЯДОЧИТЬ ПО Номенклатура, ТипЦен, Качество, Период | |||
| 24
    
        Fragster гуру 16.05.13✎ 14:59 | 
        (21) а теперь 3 последних :)     | |||
| 25
    
        Fragster гуру 16.05.13✎ 14:59 | 
        (24)+ или 5...     | |||
| 26
    
        ProgAL 16.05.13✎ 15:01 | 
        (24) Ваше решение короче. Но кореллированный запрос имеет спорное быстродействие.     | |||
| 27
    
        samozvanec 16.05.13✎ 15:03 | 
        (23) а если не на всю номенклатуру одновременно цены выставляют? если по разным позициям последние 2 периода не будут совпадать?     | |||
| 28
    
        Fragster гуру 16.05.13✎ 15:04 | 
        (26) при соединении по всем измерениям - относительно неплохо. у меня запрос (23) отрабатывает за пол секунды, при этом возвращает 22 тысячи строк     | |||
| 29
    
        Fragster гуру 16.05.13✎ 15:04 | 
        (27) все правильно будет     | |||
| 30
    
        samozvanec 16.05.13✎ 15:08 | ||||
| 31
    
        samozvanec 16.05.13✎ 15:11 | 
        (21) и у тебя тоже самое. 2 периода максимальных выбрал, но не факт, что именно эти периоды максимальные у всех записей. в случае с валютами, конечно, все здорово, но не с установкой цен.     | |||
| 32
    
        Fragster гуру 16.05.13✎ 15:19 | 
        (30) вариант (23) работает, инфа 100%     | |||
| 33
    
        ProgAL 16.05.13✎ 15:20 | 
        (31) Как это у всех записей? Там на каждую валюту опредяются свои 2 последние записи. Вы скачайте консоль запросов "Запросник" и посмотрите все ВТ. Или по частям разберите каждый запрос пакета в отдельном окне.     | |||
| 34
    
        ProgAL 16.05.13✎ 15:21 | 
        И в (23) основная таблица сканируется один раз, на каждую строку исходной таблицы выполняется определение двух последних дат, и если дата из основной таблицы входит в этот список, тогда ГДЕ ее не отсекает.     | |||
| 35
    
        samozvanec 16.05.13✎ 15:25 | 
        (33) максимум выдаст по столбцу     | |||
| 36
    
        Fragster гуру 16.05.13✎ 15:26 | ||||
| 37
    
        mikecool 16.05.13✎ 15:27 | 
        выбрать измерения, максимум(период)
  поместить ВТ выбрать из ВТ объединить выбрать измерения, максимум(период) внешнее соединение с ВТ ... по измерения И период < ВТ.Период мож так? | |||
| 38
    
        samozvanec 16.05.13✎ 15:27 | 
        (34) таблица
  25.06.13 Товар1 24.06.13 Товар1 24.06.13 Товар2 23.06.13 Товар2 ну и как ты думаешь, какие 2 даты тебе даст вложенный запрос из (23)? | |||
| 39
    
        Fragster гуру 16.05.13✎ 15:31 | 
        (38) вот универсальный запрос:
  ВЫБРАТЬ 1 КАК Период, "А" КАК Товар ПОМЕСТИТЬ Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "А" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "А" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "Б" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "Б" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, "Б" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Период, Данные.Товар ИЗ Данные КАК Данные ГДЕ Данные.Период В (ВЫБРАТЬ ПЕРВЫЕ 2 Вложенный.Период ИЗ Данные КАК Вложенный ГДЕ Вложенный.Товар = Данные.Товар УПОРЯДОЧИТЬ ПО Вложенный.Период УБЫВ) | |||
| 40
    
        MaxS 16.05.13✎ 15:37 | 
        Как вариант.
  Если не требуется получить это в запросе, можно выбрать по всему регистру, отсортировать по дате, итоги по измерениям и по дате, в цикле счетчик - досчитали до двух, команда "Продолжить" и переходим к следующему изменению... | |||
| 41
    
        ProgAL 16.05.13✎ 15:37 | 
        (39) Единственный минус из (23) нужно дату отчески надожить во вложенный запрос.     | |||
| 42
    
        ProgAL 16.05.13✎ 15:39 | 
        (35) Максимум по столбцу, но по каждой валюте свой максимум.     | |||
| 43
    
        PiterPrg 16.05.13✎ 15:39 | 
        Я предлагаю как-то так:
  ВЫБРАТЬ Товар, МАКСИМУМ(Период) КАК Период ПОМЕСТИТЬ Периоды1 ИЗ РегистрСведений.РС КАК П1 СГРУППИРОВАТЬ ПО Товар; ВЫБРАТЬ П2.Товар, МАКСИМУМ(П2.Период) КАК Период ПОМЕСТИТЬ Периоды2 ИЗ РегистрСведений.РС КАК П2 ЛЕВОЕ СОЕДИНЕНИЕ Периоды1 КАК П1 ПО П1.Товар = П2.Товар И П2.Период < П1.Период ГДЕ П1.Товар ЕСТЬ НЕ NULL СГРУППИРОВАТЬ ПО П2.Товар; ВЫБРАТЬ Д.Товар, Д.КолВо ИЗ РегистрСведений.РС КАК Д ЛЕВОЕ СОЕДИНЕНИЕ Периоды1 КАК П1 ПО Д.Товар = П1.Товар И Д.Период = П1.Период ЛЕВОЕ СОЕДИНЕНИЕ Периоды2 КАК П2 ПО Д.Товар = П2.Товар И Д.Период = П2.Период ГДЕ П1.Товар ЕСТЬ НЕ NULL И П2.Товар ЕСТЬ НЕ NULL | |||
| 44
    
        PiterPrg 16.05.13✎ 15:41 | 
        (43) Что-то последняя строчка в код не включилась :-) Ну я думаю, понятно     | |||
| 45
    
        samozvanec 16.05.13✎ 15:42 | 
        (42) ага, а выдаст по столбцу, я о том же     | |||
| 46
    
        PiterPrg 16.05.13✎ 15:46 | 
        (43) В последнем условии должно быть или :-)
  П1.Товар ЕСТЬ НЕ NULL ИЛИ П2.Товар ЕСТЬ НЕ NULL Вот так | |||
| 47
    
        samozvanec 16.05.13✎ 15:59 | 
        ВЫБРАТЬ
  КурсыВалютСрезПоследних.Период, КурсыВалютСрезПоследних.Валюта ПОМЕСТИТЬ йцу ИЗ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КурсыВалютСрезПоследних.Период, КурсыВалютСрезПоследних.Валюта ПОМЕСТИТЬ фыв ИЗ РегистрСведений.КурсыВалют.СрезПоследних( , НЕ (Период, Валюта) В (ВЫБРАТЬ й.Период, й.Валюта ИЗ йцу КАК й)) КАК КурсыВалютСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ йцу.Период, йцу.Валюта ИЗ йцу КАК йцу ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ фыв.Период, фыв.Валюта ИЗ фыв КАК фыв | |||
| 48
    
        ProgAL 16.05.13✎ 16:11 | 
        Жесть, но сработет.     | |||
| 49
    
        samozvanec 16.05.13✎ 16:12 | 
        про максимум я нагло солгал) извиняюсь     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |