Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
cov Member Откуда: Сообщений: 17 |
Доброе время суток! столкнулся с проблемой построения запроса, гуглил,но ничего не нашел подходящего у меня sql 2008 r2 есть таблица CREATE TABLE [dbo].[exch_Trades]( [IdExchange] [smallint] NOT NULL, [IdTradeOperation] [smallint] NOT NULL, [IdPair] [smallint] NOT NULL, [price] [decimal](18, 8) NOT NULL, [amount] [decimal](18, 8) NOT NULL, [tid] [bigint] NOT NULL, [timest] [datetime2](7) NOT NULL ) ON [PRIMARY] она содержит данные
есть скрипт который группирует и вытаскивает необходимые данные declare @idExch int =1 declare @idPair int =1 declare @Step int =5 select sum(case when vp.v2 = 1 then vp.price End) [first], sum(case when vp.v1 = 1 then vp.price End) [last], dateadd( mi, datediff( mi,'20150101', vp.timest )/@Step*@Step, '20150101' ) [date], max(vp.price) max_num, min(vp.price)min_num, sum(vp.amount) volume from (select * , row_number() over(PARTITION BY dateadd( mi, datediff( mi,'20150101', timest )/@Step*@Step, '20150101' ) ORDER BY timest desc ,tid desc) v1 , row_number() over(PARTITION BY dateadd( mi, datediff( mi,'20150101', timest )/@Step*@Step, '20150101' ) ORDER BY timest,tid ) v2 from dbo.exch_Trades tr where IdExchange = @idExch and IdPair = @idPair) vp group by dateadd( mi, datediff( mi,'20150101', vp.timest )/@Step*@Step, '20150101' ) order by dateadd( mi, datediff( mi,'20150101', vp.timest )/@Step*@Step, '20150101' ) asc все работает правильно за исключением того что : Step =5 - групиировать по 5 минут вытащить минимальную цену,максимальну цену,первую на смене 5 минут и последнюю но бывают временные пропуски ,например получаю минуты 35, 40 пропущена (т.к не было торгов),45, 50,55
хотелось бы чтобы данные брались в случае пропуска от предыдущей колонки last,но время проставлялось правильно,т.е хочу такое:
пропусков может быть и не 1 ,а более тогда заполняются по аналогии с одним |
|||
3 июн 15, 20:32 [17727479] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
cov, ну так сделайте таблицу, в которой не будет пропуска во времени и соедините с ней. |
4 июн 15, 10:05 [17728656] Ответить | Цитировать Сообщить модератору |
cov Member Откуда: Сообщений: 17 |
Minamoto, я пытался получить range дат в диапазоне с шагом Step как в скрипте и приджоинится,но мало того что куча кастылей в инете как это сделать, во вторых сложность вызывает последний пункт призвоение значений от поля last последней записи до пропуска |
4 июн 15, 10:51 [17729001] Ответить | Цитировать Сообщить модератору |
Minamoto Member Откуда: Москва Сообщений: 1162 |
cov, "неправильно ты, дядя Федор, тестовые данные готовишь" Вот как надо:
Скрипт примерно таким получится. declare @idExch int =1; declare @idPair int =1; declare @Step int =5; with small_calendar as ( select cast('2015-05-30 00:00:00' as datetime2) as datestart union all select dateadd(mi, @Step, datestart) from small_calendar where datestart < cast('2015-05-31 00:00:00' as datetime2) ) select isnull(first_price.price, last_price.price) as [First] , last_price.price as [Last] , sc.datestart as [Date] , isnull(max(et.price), last_price.price) as [Max_num] , isnull(min(et.price), last_price.price) as [Min_num] , isnull(sum(et.amount), 0) as [Volume] from small_calendar sc outer apply (select top 1 price from [#exch_Trades] et where et.IdExchange = @idExch and et.IdPair = @idPair and et.timest between sc.datestart and dateadd(mi, @Step, datestart) order by et.timest, et.tid) as first_price outer apply (select top 1 price from [#exch_Trades] et where et.IdExchange = @idExch and et.IdPair = @idPair and et.timest < dateadd(mi, @Step, datestart) order by et.timest desc, et.tid desc) as last_price left join [#exch_Trades] et on et.IdExchange = @idExch and et.IdPair = @idPair and et.timest between sc.datestart and dateadd(mi, @Step, datestart) group by sc.datestart, first_price.price, last_price.price option (maxrecursion 1000) Надеюсь, понятно, что я для примера сделал таблицу с календарем через CTE, при регулярном использовании ее стоит материализовать - т.е. создать специальную таблицу с датами. |
|
4 июн 15, 11:55 [17729437] Ответить | Цитировать Сообщить модератору |
cov Member Откуда: Сообщений: 17 |
Minamoto, спасибо за пример) учту ваши замечания!) бутерброд колбасой на язык |
4 июн 15, 15:24 [17730969] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |