Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помощь в написании hive / sql script / 11 сообщений из 11, страница 1 из 1
28.12.2017, 18:00
    #39577499
startDBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
день добрый,
нужна помощь в написании скрипта на языке HIVE или TSQL перевод на HIVE я сделаю сам, важно понять логику как правильно это написать.

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

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

потребуется опорная таблица с полным набором часов в сутках (24 строки, со значениями от 0 до 23). далее - left join этой опорной таблицы на твои исходные данные. дырки заполнять посредством last_value() over(), min() | max() over(). При их отсутствии - посредством cross apply(top 1). и при его отсутствии - при помощи коррелированного подзапроса в предложении SELECT
...
Рейтинг: 0 / 0
28.12.2017, 18:47
    #39577518
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
Добрый Э - Эх, а тебя не смущает, что автор размножает в две стороны? Тут слегка позаковыристее надо, кмк.
...
Рейтинг: 0 / 0
28.12.2017, 18:50
    #39577519
помощь в написании hive / sql script
Cammomile,

меня - не смущает....
...
Рейтинг: 0 / 0
28.12.2017, 18:53
    #39577520
помощь в написании hive / sql script
Cammomile,

он же словами всё описал.... словесное описание полностью соответствует нарисованной картинке. поэтому если что и смущает - то лишь отсутствие репрезентативных юзабильных тестовых данных. создается впечатление, что это мы должны быть заинтересованы в решении поставленной задачи, а не ТС...
...
Рейтинг: 0 / 0
28.12.2017, 19:23
    #39577528
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
Как-то так, я полагаю.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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  /*прост для наглядности */
...
Рейтинг: 0 / 0
31.12.2017, 12:06
    #39578368
startDBA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
Cammomile, спасибо за ответ, но это не решает моей задачи,


OUTER APPLY можно поменят на чот то другое? в Hive это не поддерживается, можно воспользоватся оконными функциями или with?
...
Рейтинг: 0 / 0
31.12.2017, 15:59
    #39578390
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
Что значит не решает? Делает ровно то, что ты нарисовал.
Если это не то, то опиши более внятно.
...
Рейтинг: 0 / 0
31.12.2017, 16:07
    #39578392
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
startDBA в Hive это не поддерживается, можно воспользоватся оконными функциями или with? Бида какая, а почему на форуме T-SQL программистов должно быть важно, что там поддерживается в HIVE?
...
Рейтинг: 0 / 0
31.12.2017, 16:08
    #39578393
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
Добрый Э - ЭхstartDBA,

потребуется опорная таблица с полным набором часов в сутках (24 строки, со значениями от 0 до 23). далее - left join этой опорной таблицы на твои исходные данные. дырки заполнять посредством last_value() over(), min() | max() over(). При их отсутствии - посредством cross apply(top 1). и при его отсутствии - при помощи коррелированного подзапроса в предложении SELECT
...
Рейтинг: 0 / 0
01.01.2018, 15:42
    #39578546
Massa52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
помощь в написании hive / sql script
startDBA,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помощь в написании hive / sql script / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]