Имя: Пароль:
1C
1С v8
Запрос по курсам валют
0 Slaventiya
 
24.01.18
21:29
По каждой валюте получить временные интервалы ЗАПРОСОМ, в которых курс не изменялся.


Пример
Данные в регистре:

Период               Валюта                Курс
01.01.2000          USD                       1,9
02.01.2000          USD                       1,9
03.01.2000          USD                       1,95
04.01.2000          USD                       1,8
05.01.2000          USD                       1,95
01.01.2000          EUR                       2
02.01.2000          EUR                       2
03.01.2000          EUR                       2
04.01.2000          EUR                       2
05.01.2000          EUR                       2

Результат

ДатаС       ДатаПо         Валюта   Курс

01.01.2000  02.01.2000     USD      1,9
03.01.2000  03.01.2000     USD      1,95
04.01.2000  04.01.2000     USD      1,8
05.01.2000  08.09.2017     USD      1,95
01.01.2000  08.09.2017     EUR      2

Нет уже мыслей, прошу помощи
1 trooba
 
24.01.18
21:39
(0) выбрать из регистра периодами
2 Михаил Козлов
 
24.01.18
23:23
Попробуйте взять минимум и максимум от периода, группируя по валюте и значению курса.
3 Slaventiya
 
24.01.18
23:28
(2) Не взлетит, присовпадении значений курса будет ошибочный интервал.
4 Fram
 
25.01.18
00:00
(0)
- соединяете регистр с самим собой по Валютам и Рег1.Период < Рег2.Период
- берете мин по Рег2.Период и группируете по Валюте и Рег1.Период
- далее по Валютам и Рег1.Период еще раз соединяете с регистром чтобы получить курс.

такую задачку на собеседованиях дают обычно )
5 Fram
 
25.01.18
00:03
(4)+ к первому пункту надо еще добавить условие что Рег1.Курс <> Рег2.Курс, чтобы пропустить записи с тем же курсом.
6 Franchiser
 
гуру
25.01.18
01:01
(0) собеседование?
7 Fram
 
25.01.18
01:13
(4)+ и не способность ее решить дает вам право претендовать только на начинающего (junior) программиста 1С, имхо
8 КрасныйРассвет 2_0
 
25.01.18
01:23
(6) Похоже)
(7) ИМХО, там люди ищут кодера, а не Программиста 1С
9 VladZ
 
25.01.18
05:11
(5) Немного изменим условие задачи. Пусть за 3 января будет курс 2.1.  
03.01.2000          EUR                       2.1

А с 4го - опять 2.
10 Slaventiya
 
25.01.18
08:32
Спасибо за отзывы, решил сам примерно так как и описано в п. 4, 5 ...
11 Ildarovich
 
25.01.18
08:53
Если не думать об эффективности, то можно так: ВЫБРАТЬ
    ДАТАВРЕМЯ(2000, 1, 1) КАК Период,
    "USD" КАК Валюта,
    1.9 КАК Курс
ПОМЕСТИТЬ Дано

ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 2), "USD", 1.9
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 3), "USD", 1.95
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 4), "USD", 1.8
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 5), "USD", 1.85
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 1), "EUR", 2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 2), "EUR", 2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 3), "EUR", 2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 4), "EUR", 2
ОБЪЕДИНИТЬ ВЫБРАТЬ ДАТАВРЕМЯ(2000, 1, 5), "EUR", 2
;

ВЫБРАТЬ
    Дано.Период,
    Дано.Валюта,
    Дано.Курс,
    КОЛИЧЕСТВО(Было.Курс) КАК Номер
ПОМЕСТИТЬ Интервалы
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Было
        ПО (Было.Валюта = Дано.Валюта)
            И (Было.Период <= Дано.Период)
            И (Было.Курс <> Дано.Курс)
СГРУППИРОВАТЬ ПО
    Дано.Период,
    Дано.Валюта,
    Дано.Курс
;
ВЫБРАТЬ
    МИНИМУМ(Интервалы.Период) КАК ДатаС,
    МАКСИМУМ(Интервалы.Период) КАК ДатаПо,
    Интервалы.Валюта,
    Интервалы.Курс
ИЗ
    Интервалы КАК Интервалы
СГРУППИРОВАТЬ ПО
    Интервалы.Валюта,
    Интервалы.Курс,
    Интервалы.Номер
УПОРЯДОЧИТЬ ПО
    Интервалы.Валюта,
    ДатаС
Если данных много и эффективность важна, то можно взять метод решения из http://catalog.mista.ru/public/402534/
12 Fram
 
25.01.18
10:11
(9) и что?
13 Fram
 
25.01.18
10:16
(9) если что, то в (5) имелось ввиду добавить в условие соединения, а не в раздел ГДЕ, как, возможно ты подумал.