Je dois créer une table Hive avec trois colonnes (sprint_name, begin_date, end_date). J'ai la colonne sprint_name remplie et en fonction de cela, je souhaite remplir les deux autres colonnes sur deux semaines incrément. Donc en gros, un sprint dure deux semaines. Si la ruche n'est pas possible, aidez-moi s'il vous plaît à créer ceci dans un serveur SQL.
Sprint_name Begin_date End_date Sprint 1.1 METADATA FYE20 2/6/2019 2/19/2019 Sprint 1.2 METADATA FYE20 2/20/2019 3/5/2019 Sprint 1.3 METADATA FYE20 3/6/2019 3/19/2019 Sprint 1.4 METADATA FYE20 Sprint 1.5 METADATA FYE20 Sprint 1.6 METADATA FYE20 Sprint 1.6 METADATA SALE FYE20 Sprint 1.7 METADATA FYE20 Sprint 2.1 METADATA FYE20 Sprint 2.2 METADATA FYE20 Sprint 2.3 METADATA FYE20 Sprint 2.3 METADATA SALE FYE20 Sprint 2.3 METADATA DOWN FYE20 Sprint 2.4 METADATA FYE20 Sprint 2.5 METADATA FYE20 Sprint 2.6 METADATA FYE20 7/10/2019 7/23/2019 Sprint 2.7 SALE FYE20 7/24/2019 8/6/2019 Sprint 2.7 METADATA FYE20 7/24/2019 8/6/2019 Sprint 3.1 METADATA FYE20 . . . Sprint 4.6 METADATA FYE20 . . Sprint 1.1 METADATA FYE21
3 Réponses :
Dans SQL-Server, en supposant que vous ayez les valeurs begin_date
et end_date
pour le premier enregistrement,
vous pouvez utiliser la fonction window pour mettre à jour les valeurs de date des lignes suivantes.
CREATE TABLE Table1 ( Id Int Identity(1,1),Sprint_name varchar(max),Begin_date date, end_date date ) INSERT INTO Table1 Values ('Sprint 1.1 METADATA FYE20' , '2/6/2019' , '2/19/2019' ) ,('Sprint 1.2 METADATA FYE20' , NULL, NULL) ,('Sprint 1.3 METADATA FYE20',NULL,NULL)--insert all sprint_name values and NULL in begin_Date,end_date columns ;with cte as( select Id, sprint_name, ISNULL(dateadd(day,((id-1)*14),first_value(begin_Date) over (order by id rows unbounded preceding)),begin_date) as begin_date, ISNULL(dateadd(day,((id-1)*14),first_value(end_date) over (order by id rows unbounded preceding)),end_date) as end_date from Table1 ) update T set T.Begin_Date=C.Begin_Date, T.End_Date = C.End_Date from Table1 T inner join CTE C on C.Id = T.Id;
Ajout de la réponse ci-dessous si vous voulez le faire dans Hive.
INSERT INTO TABLE test_dev_db.test_date VALUES (1,'Sprint 1.1','2019-02-06','2019-02-19' ), (2,'Sprint 1.2',NULL,NULL), (3,'Sprint 1.3',NULL,NULL ), (4,'Sprint 1.4',NULL,NULL); with date_range as( select Userid ,sprint_name ,date_add(first_value(start_date) over (order by Userid rows unbounded preceding),((Userid-1)*14)) as start_date ,date_add(first_value(end_date) over (order by Userid rows unbounded preceding),((Userid-1)*14)) as end_date from test_dev_db.test_date ) insert overwrite table test_dev_db.test_date select date_range.Userid,date_range.sprint_name ,date_range.start_date ,date_range.end_date from date_range; hive> select * from test_dev_db.test_date; OK 1 Sprint 1.1 2019-02-06 2019-02-19 2 Sprint 1.2 2019-02-20 2019-03-05 3 Sprint 1.3 2019-03-06 2019-03-19 4 Sprint 1.4 2019-03-20 2019-04-02 Time taken: 0.206 seconds, Fetched: 4 row(s)
En ne chargeant que quatre enregistrements comme échantillon, vous pouvez charger tous les enregistrements.
CREATE TABLE IF NOT EXISTS test_dev_db.test_date ( Userid int ,sprint_name string ,start_date date ,end_date date ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS orc ;
Il y a une autre astuce pour mettre à jour la table en utilisant CTE avec Posexplode dans Hive.
hive> select * from db.test_date; OK 1 Sprint 1.1 METADATA FYE20 2019-02-06 2019-02-19 2 Sprint 1.2 METADATA FYE20 2019-02-20 2019-03-05 3 Sprint 1.3 METADATA FYE20 2019-03-06 2019-03-19 4 Sprint 1.4 METADATA FYE20 2019-03-20 2019-04-02 5 Sprint 1.5 METADATA FYE20 2019-04-03 2019-04-16 6 Sprint 1.6 METADATA FYE20 2019-04-17 2019-04-30 7 Sprint 1.6 METADATA SALE 2019-05-01 2019-05-14 8 Sprint 1.7 METADATA FYE20 2019-05-15 2019-05-28 9 Sprint 2.1 METADATA FYE20 2019-05-29 2019-06-11 10 Sprint 2.2 METADATA FYE20 2019-06-12 2019-06-25
Insérez le premier enregistrement avec votre date de début et date de fin et laissez la date comme nulle pour le reste des entrées.
with CTE AS ( select date_add(start_date,((pe.i)* 14)) as start_date,date_add(end_date,((pe.i)*14)) as end_date,pe.i+1 as userid from db.test_date lateral view posexplode(split(space(10-1),' ')) pe as i,x where start_date is not null ) insert overwrite table db.test_date select t.Userid ,t.sprint_name ,d.start_date ,d.end_date FROM db.test_date t CROSS JOIN CTE d on d.userid=t.userid
INSERT INTO TABLE db.test_date VALUES (1,'Sprint 1.1 METADATA FYE20','2019-02-06','2019-02-19' ), (2,'Sprint 1.2 METADATA FYE20',NULL,NULL), (3,'Sprint 1.3 METADATA FYE20',NULL,NULL ), (4,'Sprint 1.4 METADATA FYE20',NULL,NULL), (5,'Sprint 1.5 METADATA FYE20',NULL,NULL), (6,'Sprint 1.6 METADATA FYE20',NULL,NULL), (7,'Sprint 1.6 METADATA SALE ',NULL,NULL), (8,'Sprint 1.7 METADATA FYE20',NULL,NULL), (9,'Sprint 2.1 METADATA FYE20',NULL,NULL), (10,'Sprint 2.2 METADATA FYE20',NULL,NULL);
;
Remarque: j'ai pensé à utiliser posexplode (split (space (max (userid) -min (userid), '')) pe comme i, x mais max & min ne prend pas en charge UDAF.
résultats:
CREATE TABLE IF NOT EXISTS db.test_date ( userid int ,sprint_name string ,start_date date ,end_date date ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS orc ;
comment allez-vous identifier la date de début de chaque enregistrement individuel? la date de fin peut être définie pour deux semaines plus tard
@vikrantrana la date de début sera le lendemain de la date de fin
Pouvez-vous montrer un échantillon de date pour le premier enregistrement et vos attentes pour le reste des enregistrements?