|
Как получить последние два курса по валютам? | ☑ | ||
---|---|---|---|---|
0
мистер игрек
03.08.11
✎
15:26
|
Типа:
Доллар 10.01.11 1000-00 09.01.11 999-00 Евро 10.01.11 2000-00 09.01.11 1999-00 и т.д. |
|||
1
PR
03.08.11
✎
15:27
|
Запросом.
|
|||
2
мистер игрек
03.08.11
✎
15:28
|
(1) О какое просветление! Прям бальзам в душу!
|
|||
3
Maxus43
03.08.11
✎
15:28
|
самое простое - выбрать первые 2 и объединить по валютам
|
|||
4
мистер игрек
03.08.11
✎
15:28
|
(3) Пример можно?
|
|||
5
NcSteel
03.08.11
✎
15:29
|
(4) Выбрать первые 2 ....
|
|||
6
Buster007
03.08.11
✎
15:30
|
(0) загрузи курсы на каждый день и проблема решится )
Кто предлагает первые 2, то попробуйте сделать так, как указал автор. |
|||
7
Maxus43
03.08.11
✎
15:31
|
ВЫБРАТЬ ПЕРВЫЕ 2
КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс, КурсыВалютСрезПоследних.Кратность ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Доллар) КАК КурсыВалютСрезПоследних ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс, КурсыВалютСрезПоследних.Кратность ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Евро) КАК КурсыВалютСрезПоследних |
|||
8
мистер игрек
03.08.11
✎
15:32
|
(7) Ты предлагаешь указать каждую валюту отдельно?
Без этого никак? |
|||
9
luckyluke
03.08.11
✎
15:32
|
(7) я думаю всё же надо использовать физическую таблицу с упорядочиванием по дате, а не виртуальную среза
|
|||
10
Maxus43
03.08.11
✎
15:32
|
(7) + Итоги по валюте, но если не на каждый день курсы - то есно вернёт 2 последние записи по валюте
|
|||
11
Maxus43
03.08.11
✎
15:33
|
(8) это самое простое, можно подумать конечно чтоб покрасивей было
|
|||
12
luckyluke
03.08.11
✎
15:34
|
(8) можно выбрать срез последних и соединить с физической с условием период < период, ну и группировкой.
|
|||
13
мистер игрек
03.08.11
✎
15:34
|
(11) Извини, но это вариант не катит.
|
|||
14
мистер игрек
03.08.11
✎
15:35
|
(12) Задача надо решать в консоли отчетов
|
|||
15
мистер игрек
03.08.11
✎
15:35
|
т.е в консоле запросов
|
|||
16
Maxus43
03.08.11
✎
15:36
|
(15) параметры же там есть, в консоли
|
|||
17
мистер игрек
03.08.11
✎
15:37
|
(16) Я про валюту для примера. А так задача помасштабнее. Там элементов могут быть сотни
|
|||
18
GROOVY
03.08.11
✎
15:37
|
(7) Этим запросом мы выберем не 2 последних курса, а 2 записи, если учесть что срез последних с отбором по валюте вернет нам 1 запись, то выберем одну.
|
|||
19
NcSteel
03.08.11
✎
15:39
|
"ВЫБРАТЬ //Предпоследние
| ВложенныйЗапрос.РежимПотребления, | ПериодыСтабильностиАбонентов.Действует |ИЗ | (ВЫБРАТЬ | ПериодыСтабильностиАбонентов.РежимПотребления КАК РежимПотребления, | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентовСрезПоследних.Период) КАК Период | ИЗ | РегистрСведений.ПериодыСтабильностиАбонентов КАК ПериодыСтабильностиАбонентов | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыСтабильностиАбонентов.СрезПоследних КАК ПериодыСтабильностиАбонентовСрезПоследних | ПО ПериодыСтабильностиАбонентов.Период < ПериодыСтабильностиАбонентовСрезПоследних.Период | И ПериодыСтабильностиАбонентов.РежимПотребления < ПериодыСтабильностиАбонентовСрезПоследних.РежимПотребления | | СГРУППИРОВАТЬ ПО | ПериодыСтабильностиАбонентов.РежимПотребления) КАК ВложенныйЗапрос | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодыСтабильностиАбонентов КАК ПериодыСтабильностиАбонентов | ПО ВложенныйЗапрос.РежимПотребления = ПериодыСтабильностиАбонентов.РежимПотребления | И ВложенныйЗапрос.Период = ПериодыСтабильностиАбонентов.Период | |ОБЪЕДИНИТЬ ВСЕ | //Последние |ВЫБРАТЬ | ПериодыСтабильностиАбонентовСрезПоследних.РежимПотребления, | ПериодыСтабильностиАбонентовСрезПоследних.Действует |ИЗ | РегистрСведений.ПериодыСтабильностиАбонентов.СрезПоследних КАК ПериодыСтабильностиАбонентовСрезПоследних" |
|||
20
Buster007
03.08.11
✎
15:39
|
(18) +1
|
|||
21
NcSteel
03.08.11
✎
15:39
|
+ ТОлько не Количество(Различные) а Максимум. Писа быстро и без проверок. Но идея должна быть понятна.
|
|||
22
Maxus43
03.08.11
✎
15:42
|
(18) > (10), говорил уж что последние записи вернёт. Да и курсы валют меняются каждый день по факту, одинаковых небывает вроде)
|
|||
23
NcSteel
03.08.11
✎
15:43
|
(18) Две записи равны двум курсам , так каку валюты курс на каждый день свой назначается
|
|||
24
lubja
03.08.11
✎
15:52
|
можно так:
|
|||
25
NcSteel
03.08.11
✎
15:52
|
(24) Не так нельзя
|
|||
26
lubja
03.08.11
✎
15:52
|
ВЫБРАТЬ
КурсыВалютСрезПоследних.Период, КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс ПОМЕСТИТЬ ВТ_ПоследнийКурс ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, ) КАК КурсыВалютСрезПоследних ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ МАКСИМУМ(КурсыВалют.Период) КАК Период, КурсыВалют.Валюта ПОМЕСТИТЬ ВТ_Предпоследние ИЗ ВТ_ПоследнийКурс КАК ВТ_ПоследнийКурс ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО (КурсыВалют.Валюта = ВТ_ПоследнийКурс.Валюта) И (КурсыВалют.Период < ВТ_ПоследнийКурс.Период) СГРУППИРОВАТЬ ПО КурсыВалют.Валюта ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ КурсыВалют.Период, КурсыВалют.Валюта, КурсыВалют.Курс ПОМЕСТИТЬ ВТ_ПредпоследнийКурс ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Предпоследние КАК ВТ_Предпоследние ПО КурсыВалют.Валюта = ВТ_Предпоследние.Валюта И КурсыВалют.Период = ВТ_Предпоследние.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ПоследнийКурс.Период КАК Период, ВТ_ПоследнийКурс.Валюта КАК Валюта, ВТ_ПоследнийКурс.Курс ИЗ ВТ_ПоследнийКурс КАК ВТ_ПоследнийКурс ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВТ_ПредпоследнийКурс.Период, ВТ_ПредпоследнийКурс.Валюта, ВТ_ПредпоследнийКурс.Курс ИЗ ВТ_ПредпоследнийКурс КАК ВТ_ПредпоследнийКурс УПОРЯДОЧИТЬ ПО Валюта, Период возможно, слишком навороченый... |
|||
27
lubja
03.08.11
✎
15:53
|
(25) да... пальцы шаловливые))0
|
|||
28
Healer
03.08.11
✎
15:53
|
Я бы как-то так написал:
ВЫБРАТЬ ПЕРВЫЕ 4 NULL КАК Евро, КурсыВалютСрезПоследних.Валюта КАК Доллар, КурсыВалютСрезПоследних.Курс ИЗ РегистрСведений.КурсыВалют КАК КурсыВалютСрезПоследних ГДЕ КурсыВалютСрезПоследних.Валюта = &Доллар ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалютСрезПоследних.Валюта, NULL, КурсыВалютСрезПоследних.Курс ИЗ РегистрСведений.КурсыВалют КАК КурсыВалютСрезПоследних ГДЕ КурсыВалютСрезПоследних.Валюта = &Евро |
|||
29
NcSteel
03.08.11
✎
15:54
|
(26) Тоже что и (19) ТОлько слишком много временных таблиц..
|
|||
30
lubja
03.08.11
✎
15:55
|
(29) "мы без трудностей не можем, мы их сами создаем" (с)
|
|||
31
Healer
03.08.11
✎
15:56
|
Если хочется для всех имеющихся валют, то просто выполнять вот такой запрос:
ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалютСрезПоследних.Валюта КАК ЗНАЧЕНИЕ(КурсыВалютСрезПоследних.Валюта), КурсыВалютСрезПоследних.Курс ИЗ РегистрСведений.КурсыВалют КАК КурсыВалютСрезПоследних ГДЕ КурсыВалютСрезПоследних.Валюта = &Валюта для каждого непомеченного на удаление элемента справочника Валюты. |
|||
32
Healer
03.08.11
✎
15:57
|
Вернее такой вот:
ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалютСрезПоследних.Валюта КАК ЗНАЧЕНИЕ(КурсыВалютСрезПоследних.Валюта.НаименованиеПолное), ... |
|||
33
Buster007
03.08.11
✎
15:58
|
(28)(31) о )появляются таланты )
|
|||
34
Healer
03.08.11
✎
15:59
|
Ну... я запрос не проверял... это так, идея только :-)
|
|||
35
мистер игрек
03.08.11
✎
16:00
|
(26) Вроде получилось, сенкс
|
|||
36
Healer
03.08.11
✎
16:00
|
Не уверен, что синоним можно выражением формировать... ну-ка, проверю...
|
|||
37
Maxus43
03.08.11
✎
16:01
|
(36) нельзя конечно
|
|||
38
NcSteel
03.08.11
✎
16:01
|
(35) Эх а мое творчество оказалось не заметным ? )))
|
|||
39
Buster007
03.08.11
✎
16:01
|
(26) медленно работать будет.
|
|||
40
NcSteel
03.08.11
✎
16:02
|
(39) Оптимизировать можно.
|
|||
41
Buster007
03.08.11
✎
16:02
|
(40) я знаю )
|
|||
42
Buster007
03.08.11
✎
16:03
|
(41) далеко можно не смотреть и увидеть, что
ВЫБРАТЬ МАКСИМУМ(КурсыВалют.Период) КАК Период, КурсыВалют.Валюта ПОМЕСТИТЬ ВТ_Предпоследние ИЗ ВТ_ПоследнийКурс КАК ВТ_ПоследнийКурс ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО (КурсыВалют.Валюта = ВТ_ПоследнийКурс.Валюта) И (КурсыВалют.Период < ВТ_ПоследнийКурс.Период) СГРУППИРОВАТЬ ПО КурсыВалют.Валюта ; этот кусок можно оптимизировать ого-го |
|||
43
lubja
03.08.11
✎
16:03
|
(38) твое творчество я ща проверила... возвращает в обоих случаях последний курс... так что... ))
|
|||
44
lubja
03.08.11
✎
16:04
|
(42) ну, началось... я ж на скорую руку... )))
|
|||
45
NcSteel
03.08.11
✎
16:05
|
(43) Я давал идею.
|
|||
46
lubja
03.08.11
✎
16:06
|
(45) твоя идея возвращает последнюю запись
|
|||
47
NcSteel
03.08.11
✎
16:06
|
(42) Интересно что хочешь оптимизировать именно в этом куске?
|
|||
48
Buster007
03.08.11
✎
16:07
|
(47) подумал, я был неправ.
|
|||
49
мистер игрек
03.08.11
✎
16:08
|
(26) Ты сама придумала или где то уже есть?
|
|||
50
lubja
03.08.11
✎
16:09
|
(49) эээ... сама... ))
|
|||
51
мистер игрек
03.08.11
✎
16:10
|
(50) Все получилось, спасибо
|
|||
52
Buster007
03.08.11
✎
16:10
|
(49) не верится?)))
|
|||
53
мистер игрек
03.08.11
✎
16:12
|
(52) Стыдно признаться, но я только что узнал, чтоб временные таблицы можно использовать внутри запроса
|
|||
54
lubja
03.08.11
✎
16:12
|
(45) пересмотрела твой запрос. строчку
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентовСрезПоследних.Период) КАК Период заменить на КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПериодыСтабильностиАбонентов.Период) КАК Период и все получилось |
|||
55
lubja
03.08.11
✎
16:13
|
(51) так что, если запрос NcSteel реально работает быстрее моего, то лучше его переписать и юзать
|
|||
56
мистер игрек
03.08.11
✎
16:16
|
(38) Блин, у меня с абстракцией плохо
|
|||
57
lubja
03.08.11
✎
16:20
|
(56) держи переделанный запрос NcSteel
ВЫБРАТЬ //Предпоследние ВложенныйЗапрос.Валюта, КурсыВалют.Курс ИЗ (ВЫБРАТЬ КурсыВалют.Валюта КАК Валюта, МАКСИМУМ(КурсыВалют.Период) КАК Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних ПО КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта И КурсыВалют.Период < КурсыВалютСрезПоследних.Период СГРУППИРОВАТЬ ПО КурсыВалют.Валюта) КАК ВложенныйЗапрос ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ВложенныйЗапрос.Валюта = КурсыВалют.Валюта И ВложенныйЗапрос.Период = КурсыВалют.Период ОБЪЕДИНИТЬ ВСЕ //Последние ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс ИЗ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних |
|||
58
NcSteel
03.08.11
✎
16:38
|
(57) А меня лень обуяла )))
|
|||
59
lubja
03.08.11
✎
16:40
|
(58) а мне работать не кайф ))
|
|||
60
ssh2006
03.08.11
✎
17:11
|
Вариант с коррелированным запросом в соединении
ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Период КАК ПоследняяДата, КурсыВалют.Период КАК ПредпоследняяДата, КурсыВалютСрезПоследних.Курс КАК ПоследнийКурс, КурсыВалют.Курс КАК ПредпоследнийКурс ИЗ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО ((КурсыВалют.Валюта, КурсыВалют.Период) В (ВЫБРАТЬ КурсыВалют.Валюта, МАКСИМУМ(КурсыВалют.Период) КАК Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Период < КурсыВалютСрезПоследних.Период И КурсыВалют.Валюта = КурсыВалютСрезПоследних.Валюта СГРУППИРОВАТЬ ПО КурсыВалют.Валюта)) |
|||
61
fisher
03.08.11
✎
17:17
|
Самый элегантный вариант - коррелированным подзапросом с ВЫБРАТЬ ПЕРВЫЕ 2
|
|||
62
ssh2006
03.08.11
✎
17:36
|
Вот он:
ВЫБРАТЬ ТаблицаРегистра.Период, ТаблицаРегистра.Валюта, ТаблицаРегистра.Курс ИЗ РегистрСведений.КурсыВалют КАК ТаблицаРегистра ГДЕ (ТаблицаРегистра.Валюта, ТаблицаРегистра.Период) В (ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалют.Валюта, КурсыВалют.Период КАК Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Валюта = ТаблицаРегистра.Валюта УПОРЯДОЧИТЬ ПО Период УБЫВ) |
|||
63
ssh2006
03.08.11
✎
17:41
|
Это самый короткий вариант видимо
|
|||
64
fisher
03.08.11
✎
17:47
|
Достаточно просто
ВЫБРАТЬ ТаблицаРегистра.Период, ТаблицаРегистра.Валюта, ТаблицаРегистра.Курс ИЗ РегистрСведений.КурсыВалют КАК ТаблицаРегистра ГДЕ ТаблицаРегистра.Период В (ВЫБРАТЬ ПЕРВЫЕ 2 КурсыВалют.Период КАК Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Валюта = ТаблицаРегистра.Валюта УПОРЯДОЧИТЬ ПО Период УБЫВ) |
|||
65
lubja
03.08.11
✎
17:49
|
(64) а если валют все-таки не 2, а 3? :)
|
|||
66
ssh2006
03.08.11
✎
17:50
|
Не имеет значения
|
|||
67
fisher
03.08.11
✎
17:54
|
(65) Цифра 2 относится к глубине выбираемой истории курсов по каждой валюте, а не к количеству валют :)
|
|||
68
ssh2006
03.08.11
✎
17:54
|
(64) Да
|
|||
69
lubja
03.08.11
✎
18:02
|
(66) сори, невнимательно смотрела)
|
|||
70
NcSteel
03.08.11
✎
20:03
|
(67) А если курс не менялся ?
|
|||
71
ssh2006
03.08.11
✎
20:36
|
Если требуется получить предыдущий отличный от последнего курс в варианте (60) можно можно добавить условие.
|
|||
72
Киборг
03.08.11
✎
21:55
|
м.б. так:
ВЫБРАТЬ * ПОМЕСТИТЬ Посл ИЗ РегистрСведений.КурсыВалют.СрезПоследних(&Дата, ) КАК КурсыВалютСрезПоследних ; ВЫБРАТЬ * ИЗ Посл КАК Посл ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних( &Дата, (НЕ (Период, Валюта) В (ВЫБРАТЬ Посл.Период, Посл.Валюта ИЗ Посл КАК Посл))) КАК КурсыВалютСрезПоследних |
|||
73
fisher
04.08.11
✎
11:51
|
(70) Тогда придется коррелированный подзапрос делать не по основной таблице регистра, а по подзапросу, возвращающему различные курсы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |