Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Нужно выбрать курсы валют из таблицы по датам. Таблица не сплошная, есть пропуски и поэтому надо брать ближайшие по датам значения до или после заданной даты. Сделал принципиально вот так:
create table #t(dat smalldatetime,cur char(3),val decimal(10,2))
insert into #t(dat,cur,val) values(convert(smalldatetime,'01.02.2014',104),'USD',35.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'01.03.2014',104),'USD',38.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'01.05.2014',104),'USD',39.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'20.05.2014',104),'USD',40.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'01.06.2014',104),'USD',42.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'05.06.2014',104),'USD',44.34)
insert into #t(dat,cur,val) values(convert(smalldatetime,'01.08.2014',104),'USD',35.34)

declare @d smalldatetime
set @d=convert(smalldatetime,'28.05.2014',104)--заданная дата

select 
case when datediff(hour,d,@d)>datediff(hour,@d,d1) then (select val from #t where dat=d1)
else (select val from #t where dat=d)
end as val
from
(select max(dat) as d
from #t 
where dat<@d
) a
join
(select min(dat) as d1
from #t
where dat>@d
) a1 on d<d1

drop table #t

по другому можно ещё как-нибудь?
17 дек 14, 11:02    [17009214]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SELECT [Дата]=@d,val=(SELECT TOP(1) val FROM #t WHERE dat<=@d ORDER BY dat DESC);
17 дек 14, 11:07    [17009263]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
select top 1*
from
(select top 1 dat,cur,val from #t where dat<@d order by dat
union all
select top 1 dat,cur,val from #t where dat>@d order by dat
) a
order by abs(datediff(hour,@d,dat))
17 дек 14, 11:09    [17009285]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
select top 1*
from
(select top 1 dat,cur,val from #t where dat<@d order by dat desc
union all
select top 1 dat,cur,val from #t where dat>@d order by dat
) a
order by abs(datediff(hour,@d,dat))
17 дек 14, 11:11    [17009305]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
iap
SELECT [Дата]=@d,val=(SELECT TOP(1) val FROM #t WHERE dat<=@d ORDER BY dat DESC);

так он берёт ближайшую раннюю, а надо, что если более поздняя ближе, то брал её
17 дек 14, 11:14    [17009337]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
select top 1*
from
(select top 1 dat,cur,val from #t where dat<@d order by dat desc
union all
select top 1 dat,cur,val from #t where dat>@d order by dat
) a
order by abs(datediff(hour,@d,dat))

да уж, конечно это будет куда получше, спасибо
17 дек 14, 11:18    [17009368]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
так он берёт ближайшую раннюю, а надо, что если более поздняя ближе, то брал её

Имхо это неправильно.Курс действует от даты до даты.
17 дек 14, 11:20    [17009385]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
sposad
Glory
select top 1*
from
(select top 1 dat,cur,val from #t where dat<@d order by dat desc
union all
select top 1 dat,cur,val from #t where dat>@d order by dat
) a
order by abs(datediff(hour,@d,dat))


да уж, конечно это будет куда получше, спасибо
Курс из будущего!
17 дек 14, 11:30    [17009467]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
sposad
пропущено...

да уж, конечно это будет куда получше, спасибо
Курс из будущего!

ТС что-то знает... :)
17 дек 14, 11:31    [17009481]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
sposad
так он берёт ближайшую раннюю, а надо, что если более поздняя ближе, то брал её

Имхо это неправильно.Курс действует от даты до даты.

это нужно для приблизительной картины-диаграммы при том, что в таблице с курсами может тупо не быть данных за все даты, поэтому сказать до какой там даты был этот курс - нельзя. А выбирать надо не только на текущую дату...
17 дек 14, 11:34    [17009497]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
это нужно для приблизительной картины-диаграммы при том, что в таблице с курсами может тупо не быть данных за все даты, поэтому сказать до какой там даты был этот курс - нельзя. А выбирать надо не только на текущую дату...

И почему вы решили, что на 26.05.2014 должен действовать курс 01.06.2014, а на 25.05.2014 - от 20.05.2014 ?
Ведь ни 25.05.2014, ни 26.05.2014 у вас нет в таблице.
У вас курс меняется строго в середине между двумя датами что ли?
17 дек 14, 11:38    [17009534]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
sposad
это нужно для приблизительной картины-диаграммы при том, что в таблице с курсами может тупо не быть данных за все даты, поэтому сказать до какой там даты был этот курс - нельзя. А выбирать надо не только на текущую дату...
Тогда для приблизительной нужно вычислять среднее (точнее, точку на прямой для соответствующей даты), а не брать ближайшее значение.
17 дек 14, 11:42    [17009561]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
sposad
это нужно для приблизительной картины-диаграммы при том, что в таблице с курсами может тупо не быть данных за все даты, поэтому сказать до какой там даты был этот курс - нельзя. А выбирать надо не только на текущую дату...

И почему вы решили, что на 26.05.2014 должен действовать курс 01.06.2014, а на 25.05.2014 - от 20.05.2014 ?
Ведь ни 25.05.2014, ни 26.05.2014 у вас нет в таблице.
У вас курс меняется строго в середине между двумя датами что ли?

Я, вообще-то тут не решаю, а предлагаю, и мне было сказано, что такой алгоритм сойдёт для решения. А что там можно ещё придумать? Добивать таблицу курсов самому?
17 дек 14, 11:46    [17009599]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
alexeyvg
sposad
это нужно для приблизительной картины-диаграммы при том, что в таблице с курсами может тупо не быть данных за все даты, поэтому сказать до какой там даты был этот курс - нельзя. А выбирать надо не только на текущую дату...
Тогда для приблизительной нужно вычислять среднее (точнее, точку на прямой для соответствующей даты), а не брать ближайшее значение.

в принципе и так можно, конечно, хотя пропуски там в среднем дня 3-5 и это копейки. Ну если не брать декабрь с ноябрём:)
17 дек 14, 11:48    [17009620]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
Я, вообще-то тут не решаю, а предлагаю, и мне было сказано, что такой алгоритм сойдёт для решения. А что там можно ещё придумать? Добивать таблицу курсов самому?

Сделать тогда не даты курсов, а периоды курсов
17 дек 14, 11:49    [17009625]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
sposad
Я, вообще-то тут не решаю, а предлагаю, и мне было сказано, что такой алгоритм сойдёт для решения. А что там можно ещё придумать? Добивать таблицу курсов самому?

Сделать тогда не даты курсов, а периоды курсов

а как? есть заявка на что-то с суммой пусть в баксах, она имеет дату, но её так и не платили, так что фактических затрат нет. Как тогда оценить стоимость этого хозяйства в рублях на какую либо дату прошлого периода?
17 дек 14, 11:57    [17009686]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
а как?

В смысле ?
Сделать 2 поля в таблице - начало и конец действия курса
17 дек 14, 11:58    [17009692]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
sposad
а как?

В смысле ?
Сделать 2 поля в таблице - начало и конец действия курса

а откуда я его знаю?:) Я вижу по таблице, что 5-го числа было 20, а 10-го - 23. Реально может 20 и было до 6-го числа, но по таблице я этого не вижу. Я не делаю этой таблицы, а беру, что дают.
17 дек 14, 12:10    [17009770]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
а откуда я его знаю?:)

Господи.
Дата начала одного курса - 1 день/час/минута и будет датой окончания предудущего курса
17 дек 14, 12:11    [17009785]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Glory
sposad
а откуда я его знаю?:)

Господи.
Дата начала одного курса - 1 день/час/минута и будет датой окончания предудущего курса

и как это скажется на точности? Промежуточных значений всё равно нет ...
17 дек 14, 12:13    [17009797]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Glory
Member

Откуда:
Сообщений: 104760
sposad
и как это скажется на точности? Промежуточных значений всё равно нет ...

Фейспалм.
Забудьте.
Делайте так, как вам указывают.
17 дек 14, 12:15    [17009817]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
sposad,

SSIS --> Задача WebTask --> настройте на автоматическое получение курсов валют ЦБ (в инете есть подробные примеры) --> у вас будут курсы за каждый день.
17 дек 14, 17:07    [17011982]     Ответить | Цитировать Сообщить модератору
 Re: Варианты запроса получше есть ли  [new]
sposad
Member

Откуда:
Сообщений: 62187
Wlr-l
sposad,

SSIS --> Задача WebTask --> настройте на автоматическое получение курсов валют ЦБ (в инете есть подробные примеры) --> у вас будут курсы за каждый день.

да это я уже давно написал, но ставить в job на каждый день боюсь, поскольку говорят, что по частым обращением с одного и того же адреса могут прибанить
18 дек 14, 17:11    [17018439]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить