Reputation: 29
Table PJASSIGN
PPRJECT | LONINUSER | DATE |
---|---|---|
MSFT | Ken | 01/12/2022 |
MSFT | Ken | 01/13/2022 |
MSFT | John | 01/20/2022 |
MSFT | John | 01/25/2022 |
Gary | 03/13/2022 | |
Gary | 03/14/2022 | |
Gary | 03/15/2022 | |
May | 03/16/2022 | |
TSLA | Juno | 05/18/2022 |
TSLA | Juno | 05/20/2022 |
TSLA | Juno | 05/22/2022 |
TSLA | Juno | 05/24/2022 |
TABLE USERINFO
USER_PJ_ID | LONINUSER | PJASSIGN |
---|---|---|
001 | Ken | MSFT |
002 | Jay | APPL |
003 | John | MSFT |
004 | Mary | DELL |
005 | Gary | |
007 | Juno | TSLA |
009 | May |
Only extract the data(LOGINUSER) that assign to the a project and working on it continues with more than two days. And do not show the data(LOGINUSER) that haven't assign the related project in the PJASSIGN table. How can I get the expected result like below with the use of (sysday-1)?
Expected result
LOGINUSER |
---|
Ken |
Gary |
How can I develop it to fit in the requirement?
Select LOGINUSER
From PJASSIGN
where (sysdate- 1,'yyyy-mm-dd HH24:MI:SS' )
Thanks for your help.
Upvotes: 0
Views: 55
Reputation: 167877
From Oracle 12, use MATCH_RECOGNIZE
to perform row-by-row processing:
SELECT project,
loninuser
FROM PJAssign
MATCH_RECOGNIZE(
PARTITION BY project, loninuser
ORDER BY "DATE"
PATTERN (first_day consecutive_days{2,})
DEFINE
consecutive_days AS PREV("DATE") + INTERVAL '1' DAY = "DATE"
);
Which, for the sample data:
CREATE TABLE PJAssign (PROJECT, LONINUSER, "DATE") AS
SELECT 'MSFT', 'Ken', DATE '2022-01-12' FROM DUAL UNION ALL
SELECT 'MSFT', 'Ken', DATE '2022-01-13' FROM DUAL UNION ALL
SELECT 'MSFT', 'John', DATE '2022-01-20' FROM DUAL UNION ALL
SELECT 'MSFT', 'John', DATE '2022-01-25' FROM DUAL UNION ALL
SELECT 'GOOGLE', 'Gary', DATE '2022-03-13' FROM DUAL UNION ALL
SELECT 'GOOGLE', 'Gary', DATE '2022-03-14' FROM DUAL UNION ALL
SELECT 'GOOGLE', 'Gary', DATE '2022-03-15' FROM DUAL UNION ALL
SELECT 'GOOGLE', 'May', DATE '2022-03-16' FROM DUAL UNION ALL
SELECT 'TSLA', 'Juno', DATE '2022-05-18' FROM DUAL UNION ALL
SELECT 'TSLA', 'Juno', DATE '2022-05-20' FROM DUAL UNION ALL
SELECT 'TSLA', 'Juno', DATE '2022-05-22' FROM DUAL UNION ALL
SELECT 'TSLA', 'Juno', DATE '2022-05-24' FROM DUAL;
Outputs:
PROJECT LONINUSER Gary
Note: Ken only worked on a project for exactly 2 days, not more than 2 days.
db<>fiddle here
Upvotes: 4
Reputation: 13509
I think you simply need a LAG function to get your desired result -
SELECT DISTINCT LOGINUSER
FROM (SELECT LONINUSER, DATE - LAG(DATE) OVER(PARTITION BY LONINUSER ORDER BY DATE) prev_date
FROM PJASSIGN)
WHERE prev_date = 1;
And as MT0 suggests, this will give you users who works on the proects for 2 days or more. If you need users more than 2 days, You need another logic.
Upvotes: 0
Reputation: 195
what about :
select distinct LOGINUSER from PJASSIGN where trunc(date) = trunc(sysdate -1 );
Upvotes: 0