Need to add column with max value placed in the max date of each weekending
slc1axj
Vertica Customer ✭
I am partitioning my data by WeekEnd and have created a cumulative column adding up my hours.
SQL: Sum(WorkHours) OVER (partition BY WkEnd, UserName ORDER BY ReportDt, UserName ASC ROWS UNBOUNDED PRECEDING) cumhours
I need to create a column (Wkhours) to bring in only my max cumhours on the max day of the week by UserName
e.g.
Tagged:
0
Best Answer
-
mosheg Vertica Employee Administrator
SET DATESTYLE TO DMY; \set StartDate '''01-Jan-2022''' \set EndDate '''01-FEB-2022''' CREATE TABLE t30 AS SELECT 'A' || CHR(RANDOMINT(5) + 97) || '12345' AS UserName , DAYOFWEEK(dt) AS DayNumberInWeek , RANDOMINT(50) AS cumhours , dt AS ReportDt , WEEK(dt) AS week_nbr , YEAR(dt) AS year_id , date(dt) + (7 - DAYOFWEEK(dt)) AS WkEnd , YEAR(dt)*10000+MONTH(dt)*100+DAY(dt) AS date_id , TO_CHAR(dt,'Day') AS weekday_name FROM ( SELECT dt::DATE FROM ( SELECT DATE :StartDate UNION ALL SELECT DATE :EndDate ) startsel(startdt) TIMESERIES dt AS '1 DAY' OVER(ORDER BY startdt::TIMESTAMP) ) datelist; WITH dlist AS (SELECT UserName,week_nbr,year_id, MAX(cumhours) as c_max FROM t30 GROUP BY UserName,week_nbr,year_id) SELECT t.UserName, t.date_id, t.week_nbr, t.year_id, t.ReportDt, t.WkEnd, t.cumhours, case when t.cumhours=d.c_max and t.UserName=d.UserName and t.week_nbr=d.week_nbr and t.year_id=d.year_id then t.cumhours end FROM t30 t LEFT OUTER JOIN dlist d on (t.cumhours=d.c_max and t.UserName=d.UserName and t.week_nbr=d.week_nbr and t.year_id=d.year_id) GROUP BY 1,2,3,4,5,6,7,8 ORDER BY t.date_id; UserName | date_id | week_nbr | year_id | ReportDt | WkEnd | cumhours | case ----------+----------+----------+---------+------------+------------+----------+------ Aa12345 | 20220101 | 1 | 2022 | 2022-01-01 | 2022-01-01 | 14 | 14 Ac12345 | 20220102 | 2 | 2022 | 2022-01-02 | 2022-01-08 | 10 | Aa12345 | 20220103 | 2 | 2022 | 2022-01-03 | 2022-01-08 | 45 | 45 Ac12345 | 20220104 | 2 | 2022 | 2022-01-04 | 2022-01-08 | 45 | 45 Aa12345 | 20220105 | 2 | 2022 | 2022-01-05 | 2022-01-08 | 12 | Ad12345 | 20220106 | 2 | 2022 | 2022-01-06 | 2022-01-08 | 34 | 34 Aa12345 | 20220107 | 2 | 2022 | 2022-01-07 | 2022-01-08 | 45 | 45 Ac12345 | 20220108 | 2 | 2022 | 2022-01-08 | 2022-01-08 | 43 | Ac12345 | 20220109 | 3 | 2022 | 2022-01-09 | 2022-01-15 | 49 | 49 Ae12345 | 20220110 | 3 | 2022 | 2022-01-10 | 2022-01-15 | 40 | 40 Ae12345 | 20220111 | 3 | 2022 | 2022-01-11 | 2022-01-15 | 0 | Ac12345 | 20220112 | 3 | 2022 | 2022-01-12 | 2022-01-15 | 14 | Ac12345 | 20220113 | 3 | 2022 | 2022-01-13 | 2022-01-15 | 49 | 49 Ac12345 | 20220114 | 3 | 2022 | 2022-01-14 | 2022-01-15 | 26 | Ac12345 | 20220115 | 3 | 2022 | 2022-01-15 | 2022-01-15 | 10 | Aa12345 | 20220116 | 4 | 2022 | 2022-01-16 | 2022-01-22 | 19 | 19 Ac12345 | 20220117 | 4 | 2022 | 2022-01-17 | 2022-01-22 | 32 | 32 Ad12345 | 20220118 | 4 | 2022 | 2022-01-18 | 2022-01-22 | 19 | Ad12345 | 20220119 | 4 | 2022 | 2022-01-19 | 2022-01-22 | 41 | 41 Ab12345 | 20220120 | 4 | 2022 | 2022-01-20 | 2022-01-22 | 40 | 40 Ac12345 | 20220121 | 4 | 2022 | 2022-01-21 | 2022-01-22 | 20 | Aa12345 | 20220122 | 4 | 2022 | 2022-01-22 | 2022-01-22 | 4 | Ab12345 | 20220123 | 5 | 2022 | 2022-01-23 | 2022-01-29 | 4 | Ab12345 | 20220124 | 5 | 2022 | 2022-01-24 | 2022-01-29 | 16 | Ad12345 | 20220125 | 5 | 2022 | 2022-01-25 | 2022-01-29 | 11 | 11 Ab12345 | 20220126 | 5 | 2022 | 2022-01-26 | 2022-01-29 | 41 | 41 Ae12345 | 20220127 | 5 | 2022 | 2022-01-27 | 2022-01-29 | 37 | 37 Aa12345 | 20220128 | 5 | 2022 | 2022-01-28 | 2022-01-29 | 2 | 2 Ae12345 | 20220129 | 5 | 2022 | 2022-01-29 | 2022-01-29 | 5 | Ab12345 | 20220130 | 6 | 2022 | 2022-01-30 | 2022-02-05 | 24 | 24 Ae12345 | 20220131 | 6 | 2022 | 2022-01-31 | 2022-02-05 | 37 | 37 Ac12345 | 20220201 | 6 | 2022 | 2022-02-01 | 2022-02-05 | 1 | 1 (32 rows)
1
Answers
I'm seeing rows in the same weekending with cum hours. I only want cumhours on the maximum day of the week.
e.g.
Aa12345 | 20220103 | 2 | 2022 | 2022-01-03 | 2022-01-08 | 45 | 45
Ac12345 | 20220104 | 2 | 2022 | 2022-01-04 | 2022-01-08 | 45 | 45
You see two rows for two different UserName(s)
If you wish not to group by UserName then..
...
...