select * from
(
SELECT r1.Компания, r1.Дата, (select count(*) from комдата as rr where rr.Компания = r1.Компания and rr.Дата >= r1.Дата) AS xx
FROM комдата AS r1
ORDER BY r1.Компания, r1.Дата DESC
)
where xx <=3;
Курсы валют на указанную дату
Задача: получить таблицу, содержащую для каждой валюты курс на указанную дату. Если на заданную дату курса у какой-то валюты нет, выдавать курс на ближайшую предыдущую дату. Т. е. получить таблицу со столбцами: валюта и курс.
---
Задача, в общем-то, типичная для 1С:Предприятия (в версии 7.7 это называлось - периодический реквизит справочника, в 8.0 - периодический регистр сведений, и тот и другой давали возможность получить так называемый "срез последних"). Фактически, данная задача - задача нахождения среза последних.
Мне интересно, как она решалась в 1С. Точнее, мне хочется узнать текст запроса, который для этого потребуется.
И давайте возьмем СУБД попроще, скажем, firebird.
Код:
В 1С 8.0 подобное не канает...
Видимо, использовать поля родительского запроса во вложенном запросе нельзя.
Было бы интересно получить запрос, который работал бы и в 1С.
И уж заодно хотелось бы узнать, как заставить 1С выполнять задачу, поставленную в теме http://forum.codenet.ru/showthread.php?t=40676
Код:
ВЫБРАТЬ
КурсыВалют.Курс,
КурсыВалют.Валюта
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Период В
(ВЫБРАТЬ
МАКСИМУМ(КурсыВспомогательный.Период) КАК Период
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВспомогательный
ГДЕ
КурсыВспомогательный.Валюта = КурсыВалют.Валюта
И КурсыВспомогательный.Период <= &Дата)
{ГДЕ
КурсыВалют.Валюта.*}
КурсыВалют.Курс,
КурсыВалют.Валюта
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Период В
(ВЫБРАТЬ
МАКСИМУМ(КурсыВспомогательный.Период) КАК Период
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВспомогательный
ГДЕ
КурсыВспомогательный.Валюта = КурсыВалют.Валюта
И КурсыВспомогательный.Период <= &Дата)
{ГДЕ
КурсыВалют.Валюта.*}
ID | Дата | Валюта | Курс
Код:
SELECT DISTINCT TOP 1 Валюты.*
FROM Валюты
WHERE (((Валюты.Валюта)=[pVal]) AND ((Валюты.Дата)<=[pDate]))
ORDER BY Валюты.Валюта, Валюты.Дата DESC;
FROM Валюты
WHERE (((Валюты.Валюта)=[pVal]) AND ((Валюты.Дата)<=[pDate]))
ORDER BY Валюты.Валюта, Валюты.Дата DESC;
Выдаёт курс одной валюты на указанную дату.
Цитата: el scorpio
Выдаёт курс одной валюты на указанную дату.
Это-то понятно. Мне нужно получить курсы ВСЕХ валют.
P. S. Всем спасибо, задача решена, можно закрывать...