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

Откуда:
Сообщений: 173
день добрый,
нужна помощь в написании скрипта на языке HIVE или TSQL перевод на HIVE я сделаю сам, важно понять логику как правильно это написать.

прилагаю изображение которое объясняет мою задачу.
из 1 в 2 у меня получилось дойти , до результата 3 не получается, возможно результата 2 тоже не правильный.

коротко о задачи, есть дневные которые собираются на протяжнее дня, но так получаются что есть "дырки" в данных и эти дырки надо заполнить.
правила таковы:
день в часах от 0 до 23
все чего нет до первой выборки заполняется данными первой выборки, в примере выборка 23/10/2017 02:53:08 заполняет назад
все последующие вперед.

К сообщению приложен файл. Размер - 135Kb
28 дек 17, 18:00    [21070519]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Добрый Э - Эх
Guest
startDBA,

потребуется опорная таблица с полным набором часов в сутках (24 строки, со значениями от 0 до 23). далее - left join этой опорной таблицы на твои исходные данные. дырки заполнять посредством last_value() over(), min() | max() over(). При их отсутствии - посредством cross apply(top 1). и при его отсутствии - при помощи коррелированного подзапроса в предложении SELECT
28 дек 17, 18:21    [21070550]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Добрый Э - Эх, а тебя не смущает, что автор размножает в две стороны? Тут слегка позаковыристее надо, кмк.
28 дек 17, 18:47    [21070610]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Добрый Э - Эх
Guest
Cammomile,

меня - не смущает....
28 дек 17, 18:50    [21070614]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Добрый Э - Эх
Guest
Cammomile,

он же словами всё описал.... словесное описание полностью соответствует нарисованной картинке. поэтому если что и смущает - то лишь отсутствие репрезентативных юзабильных тестовых данных. создается впечатление, что это мы должны быть заинтересованы в решении поставленной задачи, а не ТС...
28 дек 17, 18:53    [21070617]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Как-то так, я полагаю.

CREATE TABLE #hours (hh int) 
INSERT INTO #hours 
SELECT TOP 24 RN= ROW_NUMBER() OVER (order by object_id)  -  1 FROM sys.objects  

 
CREATE TABLE #input
(
report_time datetime 
, depid int 
)

INSERT INTO #input SELECT '20180215 05:26:12' , 333111
INSERT INTO #input SELECT '20180215 06:26:12' , 42412 
INSERT INTO #input SELECT '20180215 09:10:12' , 31415
INSERT INTO #input SELECT '20180215 22:02:12' , 666999

SELECT 
 report_time  , depid  , hh = DATEPART(hh, report_time)  
INTO #input_hours
FROM 
  #input i 
 

SELECT 
  G.hh 
, report_time = COALESCE([z_report_time], [zz_report_time]) 
, depid =     COALESCE([z_depid], [zz_depid]) 
, '#'
, oi.depid 
, oi.report_time
FROM 
(

 
SELECT  
 H.hh
, [z_report_time]  =  Z.report_time
, [z_depid] = Z.depid 
, [zz_report_time] = ZZ.report_time
, [zz_depid] = ZZ.depid
FROM
#hours h LEFT JOIN  #input_hours ih  on ih.hh = h.hh 
OUTER APPLY (SELECT TOP (1)  h2.depid , h2.report_time FROM #input_hours h2 WHERE h2.hh  <= h.hh ORDER BY h2.hh desc  ) Z /*вниз*/
OUTER APPLY (SELECT TOP (1)  h2.depid , h2.report_time FROM #input_hours h2 WHERE h2.hh  >= h.hh ORDER BY h2.hh asc  ) ZZ /*вверх*/

) G
LEFT JOIN  #input_hours oi on oi.hh = G.hh  /*прост для наглядности */
28 дек 17, 19:23    [21070656]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
startDBA
Member

Откуда:
Сообщений: 173
Cammomile, спасибо за ответ, но это не решает моей задачи,


OUTER APPLY можно поменят на чот то другое? в Hive это не поддерживается, можно воспользоватся оконными функциями или with?
31 дек 17, 12:06    [21075885]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Что значит не решает? Делает ровно то, что ты нарисовал.
Если это не то, то опиши более внятно.
31 дек 17, 15:59    [21076171]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
startDBA
в Hive это не поддерживается, можно воспользоватся оконными функциями или with?
Бида какая, а почему на форуме T-SQL программистов должно быть важно, что там поддерживается в HIVE?
31 дек 17, 16:07    [21076176]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Добрый Э - Эх
startDBA,

потребуется опорная таблица с полным набором часов в сутках (24 строки, со значениями от 0 до 23). далее - left join этой опорной таблицы на твои исходные данные. дырки заполнять посредством last_value() over(), min() | max() over(). При их отсутствии - посредством cross apply(top 1). и при его отсутствии - при помощи коррелированного подзапроса в предложении SELECT
31 дек 17, 16:08    [21076177]     Ответить | Цитировать Сообщить модератору
 Re: помощь в написании hive / sql script  [new]
Massa52
Member

Откуда:
Сообщений: 379
startDBA,
CREATE TABLE #hours (hh int) 
INSERT INTO #hours 
SELECT TOP 24 RN= ROW_NUMBER() OVER (order by object_id)  -  1 FROM sys.objects  

CREATE TABLE #input (report_time datetime, depid int)
INSERT INTO #input SELECT '20180215 05:26:12' , 333111
INSERT INTO #input SELECT '20180215 06:26:12' , 42412 
INSERT INTO #input SELECT '20180215 09:10:12' , 31415
INSERT INTO #input SELECT '20180215 22:02:12' , 666999

DECLARE @dt DATETIME;
SELECT @dt = CAST(MIN(report_time) AS DATE) FROM #input;
SELECT hh, 
       report_time = COALESCE(report_time, DATEADD(minute, hh*60+1,  @dt)),  
	   depid
	  ,(SELECT depid FROM #input WHERE report_time <= (SELECT MIN(report_time) minT FROM #input)) d -- to down
INTO #input_hours
FROM #hours LEFT JOIN #input ON hh = DATEPART(hh, report_time)

SELECT *  
       ,u = COALESCE(ih.depid, (SELECT depid FROM #input i WHERE report_time = (SELECT MAX(report_time) FROM #input i1 WHERE i1.report_time <= ih.report_time)))
INTO #input_hours1
FROM #input_hours ih --LEFT JOIN #input i ON ih.report_time = i.report_time 

SELECT hh, report_time, 
    depid = COALESCE(depid, u, d)   
 FROM #input_hours1
1 янв 18, 15:42    [21077340]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить