Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
ElenaTomsk Member Откуда: Сообщений: 142 |
Здравствуйте, уважаемые гуру ! Вопрос вот такой : мне нужно иметь возможность посчитать любую пару в основной валюте. Например, в рублях. Но может оказаться так, что эта валюта в рублях не торгуется. Мало того, может оказаться и так, что там вообще сложная система : Монгольские тугрики торгуются только за португальские песо, песо только за реалы, реалы только за пиастры, пиастры за ракушки, ракушки за ром, ром за баксы и только уже баксы за рубли. А цена мне нужна в рублях за тугрики ! Есть структура таблицы tblMain: Id int Price float IdfFrst int IdSecond int Одну и только одну валютную пару пользователь может установить как isRoot, делается это в другой таблице tblDesc, со структурой : IdDesc int Desc varchar(20) isRoot bit Понятное дело, что нужно перебором искать валютные пары до тех пор, пока я не найду в таблице любую пару, у которой idSecond будет равна рублям. И через курсор сделать такое можно. Но можно ли сделать этот расчет без курсора, если заранее неизвестно, сколько именно валютных пар придется перебрать ? |
3 июл 17, 06:42 [20607803] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
ElenaTomsk, почитать про recursive cte. при грамотном подходе оно позволяет совершить обход практически любого графа. а уж строгое иерархическое дерево - так вообще без проблем. |
3 июл 17, 07:31 [20607825] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Бред. Если ужо очень надо - генерируем ВСЕ пары... один раз. Причем, тупым INSERT в цикле. И радуемся жизни. |
||
3 июл 17, 09:19 [20607937] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Самое веселье начнется когда путь в графе неоднозначен. |
3 июл 17, 09:21 [20607942] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
aleks2, кто бы сомневался... твоего амебочного мозга только на эту фразу и хватает. хоть бы оригинальность проявлял и внес малую толику разнообразия в свой однотипный ответ. а то уже читать скучно, ибо - предсказуемо. |
3 июл 17, 09:23 [20607950] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
3 июл 17, 09:25 [20607952] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
|
||
3 июл 17, 09:26 [20607955] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Считать курс каждый раз на лету это медленно и затратно, соглашусь что стоит рассчитывать все курсы всех валют и хранить. курсы меняются - считать и хранить, тогда и проблем с выяснением значений пары на конкретное время не будет вызывать стресс :) |
3 июл 17, 09:46 [20608007] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Эка у него припекло. Расслабься. |
||
3 июл 17, 09:49 [20608013] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
https://stackoverflow.com/questions/7259829/building-a-hierarchical-tree-with-a-single-sql-query |
3 июл 17, 10:12 [20608078] Ответить | Цитировать Сообщить модератору |
ElenaTomsk Member Откуда: Сообщений: 142 |
А чем быстрей быть считать все курсы ? Это же будет тот же самый перебор, но только пересчет всего во всё займет еще больше времение ? |
||
3 июл 17, 11:47 [20608400] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
тем что курсы не меняются каждую секунду |
||||
3 июл 17, 12:00 [20608459] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
А не лучше один раз "размотать" всё дерево в иерарихию https://docs.microsoft.com/en-us/sql/t-sql/data-types/hierarchyid-data-type-method-reference а потом поддерживать его уже в хорошем виде? |
3 июл 17, 12:03 [20608466] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Если посчитать из рублей сразу доллары и по цепочке рубль - евро - доллар, то получится всегда одно и то же, да? Я вот что-то сомневаюсь... Так что aleks2 прав - намечается неоднозначность в расчётах |
3 июл 17, 12:14 [20608512] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
А вот это ты высокочастотным трейдерам расскажи. Поржут, скажут, "ну да, каждую микросекунду". |
||||
3 июл 17, 12:15 [20608516] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
а давайте любую вашу фантазию лепить к вопросу |
||||
3 июл 17, 12:17 [20608524] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Ну построить "дорогу" - все возможные сочетания пар валют с учетом исходной задачи - recursive cte. А дальше каждый раз выбирать "оптимальный" курс (например, при продаже подороже, при покупке подешевле). |
||
3 июл 17, 12:20 [20608534] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
сейчас и тебе ответят:
![]() |
||||||
3 июл 17, 12:35 [20608592] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Так я-то предлагаю не тупым INSERT, а умным CTE |
||||
3 июл 17, 12:39 [20608603] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
Валюты конвертируют через валюту-посредника. |
3 июл 17, 12:50 [20608633] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Нужно не обходить графы, а назначить валюту посредник. Это будет и оптимальнее для запросов, и, главное, правильно в бизнес-модели, потому что автоматически найдётся множество путей с одинаковой длинной, и непонятно, какой выбрать. |
||
3 июл 17, 12:54 [20608650] Ответить | Цитировать Сообщить модератору |
Cammomile Member Откуда: Сообщений: 1214 |
Более того, там же может быть разная бизнес задача. Очевидно что у нас есть "цена" конвертации, и может быть "цена" за операцию. И в одном случае нам надо пройтись по графу подешевле, а в другом подороже. Примеров масса, например пейпал, который по-умолчанию делал двойную конвертацию, вместо того, чтоб считать в валюте счета. |
3 июл 17, 12:56 [20608657] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Скажи проще: надо СНАЧАЛА посчитать, с песнями, плясками, выбором "кратчайшего пути" и битьем в бубен... Но надо просто и тупо посчитать ВСЕ нужные курсы. |
||||
3 июл 17, 13:23 [20608774] Ответить | Цитировать Сообщить модератору |
ElenaTomsk Member Откуда: Сообщений: 142 |
Коллеги, я что-то запуталась уже. Зачем нужна валюта посредник, если все равно может оказаться так, что в ней сделки не проводятся ? Я же пример привела, каждая сделка там уникальна, вот не хотят тугрики продавать за доллары . А искусственно назначать валюту посредник и пересчитывать в нее, так задача не отличается в итоге от "пересчитать в валюту с признаком isRoot" |
||||
3 июл 17, 13:44 [20608874] Ответить | Цитировать Сообщить модератору |
s_ustinov Member Откуда: Munchen, DE Сообщений: 2209 |
Очень сомнительно, что бизнес задача состоит в покупке / продаже валюты. Скорее, речь идет о некоей торговой площадке, валюты операций на которой для покупателей и продавцов часто не совпадают, но надо показать сумму операции в "родной" валюте (букинг так делает). И в этом случае введение валюты посредника резко упрощает задачу и делает результаты расчетов более предсказуемыми. Выбирается валюта посредник или основная валюта (например USD). При вводе каждой новой валюты указываем (человек указывает) как именно пересчитывать из данной валюты в основную валюту. В результате пересчеты работают очень просто. У нас есть валюта исходная и целевая. И есть сумма в исходной валюте. Выполняем два преобразования по жестким правилам (из валюты источника в основную валюту и из основной валюты в целевую валюту) - и цель достигнута. |
||||
3 июл 17, 13:53 [20608937] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |