1
votes

Comment ajouter par programme une date de début et une date de fin pour le passé et le futur qui ont un incrément de deux semaines?

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 commentaires

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?


3 Réponses :


1
votes

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;


0 commentaires

1
votes

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
;


0 commentaires

1
votes

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
;


0 commentaires