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

Откуда: glubinka
Сообщений: 4256
CREATE TABLE Currency ( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Date datetime2(7) NOT NULL,
Cur float NOT NULL) 
GO
INSERT INTO [Tutorial].[dbo].[Currency]          ([Date]           ,[Cur])     VALUES           ('02/01/2013', 1)
INSERT INTO [Tutorial].[dbo].[Currency]          ([Date]           ,[Cur])     VALUES           ('02/10/2013', 2)
INSERT INTO [Tutorial].[dbo].[Currency]          ([Date]           ,[Cur])     VALUES           ('03/02/2013', 1.5)


Есть два времени - начало и конец периода @d1, @d2.
Надо посчитать средний курс за период @d1-@d2
Начало и конец периода @d1 , @d2 гарантированно лежит внутри дат в таблице.
Даты в таблице гарантированно возрастают, но интервал между ними случаен.
Предполагается, что курс изменяется ступеньками,
например, если в таблице есть 2 записи одна-за-другой
date1 - cur1
date2 - cur2
то для любой даты между date1 и date2 курс равен cur1
Операцию Union не использовать

если не имеется ввиду
что с 1 по 9 ферв курс был 1.0 каждый день
с 10 по 1 марта - 2.0 и.т.д

select avg(cur) from Currency where date between @d1 and @d2
итьзаджойн к таблице с 365-ю датами и 0.0 в значении?
6 мар 13, 22:01    [14022104]     Ответить | Цитировать Сообщить модератору
 Re: Eсть таблица, содержащая ID, Дату, И курс валюты  [new]
Добрый Э - Эх
Guest
Зачем генерировать весь набор дат, если в них все одно был один и тот же курс?
Что мешает просто вычислить длительность периода действия того или иного курса?
Или вопрос в чем-то другом?
7 мар 13, 05:43    [14022903]     Ответить | Цитировать Сообщить модератору
 Re: Eсть таблица, содержащая ID, Дату, И курс валюты  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Где-то так
select
	ed.Date
	, (
		select top (1)
			c.Cur
		from Currency c
		where c.Date <= ed.Date
		order by c.Date
	)
from EachDate ed

Ну или сейчас народ подтянется, чо-нить через оконные функции мож кто предложит.
7 мар 13, 06:28    [14022919]     Ответить | Цитировать Сообщить модератору
 Re: Eсть таблица, содержащая ID, Дату, И курс валюты  [new]
aleks2
Guest
tpg
Ну или сейчас народ подтянется, чо-нить через оконные функции мож кто предложит.


Ну какие, нахер, оконные функции?

<Cur>=( сумма_по_всем_датам_от_0_до_n ( Cur(i)*(date(i+1)-date(i)) ) ) / (дата_конца - дата_начала +1)

i = 0 - дата_начала
i = 1..n - даты_из_Сurrency_в_интервале_дата_начала-дата_конца
i = n+1 - дата_конца

<Cur>=(
сумма_по_всем_датам_от_0_до_n ( Cur(i)*(date(i+1) )
-
сумма_по_всем_датам_от_0_до_n ( Cur(i)*(date(i) )
) / (дата_конца - дата_начала +1)


Тут и считать то нечего.
7 мар 13, 07:04    [14022937]     Ответить | Цитировать Сообщить модератору
 Re: Eсть таблица, содержащая ID, Дату, И курс валюты  [new]
aleks2
Guest
declare @Currency  TABLE ( ID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
Date datetime2(7) NOT NULL,
Cur float NOT NULL);

declare @d1 datetime2(7) = '20130205'
      , @d2 datetime2(7) = '20130305'

set dateformat mdy
INSERT INTO @Currency          ([Date]           ,[Cur])     VALUES           ('02/01/2013', 1)
INSERT INTO @Currency          ([Date]           ,[Cur])     VALUES           ('02/10/2013', 2)
INSERT INTO @Currency          ([Date]           ,[Cur])     VALUES           ('03/02/2013', 1.5)
INSERT INTO @Currency          ([Date]           ,[Cur])     VALUES           ('03/12/2013', 1.55)
set dateformat dmy

;with 
startdate as ((select max([Date]) d1 from @Currency where [Date]<=@d1))
,
numbered as (select *, row_number() over(order by [Date]) n from @Currency where [Date] between (select d1 from startdate) and @d2 )
,
aligned as (select case n when 1 then @d1 else [Date] end [Date], [Cur] , n from numbered )
,
ranged as (select a.[Date] BDate, isnull(n.[Date], @d2) EDate, a.[Cur] from aligned a left outer join numbered n on a.n+1 = n.n )

--select * from ranged
select sum(Cur*datediff(day, BDate, EDate))/(datediff(day, @d1, @d2)+1) from ranged
7 мар 13, 09:22    [14023132]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить