By comparing the Dates in a group of data (different lines)
I have a requirement where I have to compare dates in a dataset for each employee. The data looks like this:
WITH test_data AS
(SELECT the '1' AS pk, '5900' AS emp_id, '5' AS rec_id, to_date('01-JAN-2014') AS rec_date FROM dual
UNION ALL
SELECT '2', '5900', '5', to_date('01-FEB-2014') FROM dual
UNION ALL
SELECT '3', '5900', '5', to_date('01-MAR-2014') FROM dual
UNION ALL
SELECT '4', '5900', '5', to_date('01-JAN-2014') FROM dual
UNION ALL
SELECT '5', '5900', '6', to_date('06-JAN-2014') FROM dual
UNION ALL
SELECT '6', '5900', '6', NULL FROM dual
UNION ALL
SELECT '7', '5900', '6', to_date('01-JUL-2014') FROM dual
UNION ALL
SELECT '8', '5900', '7', to_date('29-JAN-2014') FROM dual
UNION ALL
SELECT '9', '5900', '7', to_date('29-SEP-2014') FROM dual
UNION ALL
SELECT '10', '5900', '7', to_date('01-OCT-2014') FROM dual
UNION ALL
SELECT '11', '8595', '5', to_date('01-SEP-2014') FROM dual
UNION ALL
SELECT '12', '8595', '6', to_date('05-SEP-2014') FROM dual
UNION ALL
SELECT '13', '8595', '7', to_date('30-SEP-2014') FROM dual
UNION ALL
SELECT '14', '8595', '7', NULL FROM dual
)
REC_ID column is composed of 3 different types of records, which must satisfy this requirement:
REC_ID 5 acts as point of departure, and REC_ID 6 must have a REC_DATE within 7 days of REC_ID 5 REC_ID 7 must have a REC_DATE within 30 days of REC_ID 6.
- If the requirements are any record in REC_ID 5 acts like zero day or the starting point;
- Any record in REC_ID 6 must be within 7 days of the date of REC_ID 5;
- Any record in REC_ID 7 must be within 30 days from 6 REC_ID.
My results:
Expected results - satisfactory records |
EMP_ID
DATE_1
DATE_2
DATE_3
5900
1 January 14
6 January 14
29 January 14
8595
1 sep-14
5 sep-14
30 sep-14
I don't know how to compare dates in a dataset that are on different lines. I thought using self-joins, query using the window as rank (), factoring functions, but I'm stuck pretty quickly.
I appreciate all help. Thank you!
Aqua
Hello
AquaNX4 wrote:
WOW odie_63: it would be a blessing if I was... but unfortunately, I'm on 10 gr 2. That would have been great!
I'm stuck (mentally) to the fact that there is an amount without discernment of records in the base table for each type of REC_ID.
Some employees have 5 folders for REC_ID, 10 REC_ID 6 and 7 for REC_ID 7, which leaves me confused in how many self-joins I should do, or if it is at all possible. I did a lot of arithmetic of dates with the data on the same line and certain ranks () functions for data residing on different lines, but this 1 seems to confuse me...
I ran 1 self-join as below to see what it looks like and it confused me even more because I know the timestamp of the arithmetic in where clause still will not produce data as I want... I am now trying another way...
SELECT td2.rec_id,
TD2.emp_id,
TD2.rec_date
Of
test_data2 td2
LEFT JOIN test_data td1 ON td1.emp_id = td2.emp_id
It's a good start.
You want an inner join, however, not an outer join, not you? Outer join means "include td2 lines if they have data in the corresponding TD1". If I understand the question, you are only interested in cases where it is matching data.
Here's a way to do it:
WITH joined_data AS
(
SELECT d5.emp_id
d5.rec_date LIKE date_1
d6.rec_date AS date_2
d7.rec_date AS date_3
ROW_NUMBER () OVER (PARTITION BY d5.emp_id
ORDER BY d5.rec_date
d6.rec_date
d7.rec_date
) AS r_num
OF test_data d5
JOIN test_data d6 ON d6.emp_id = d5.emp_id
AND d6.rec_date > = d5.rec_date
AND d6.rec_date<= d5.rec_date="" +="">=>
JOIN test_data d7 ON d7.emp_id = d6.emp_id
AND d7.rec_date > = d6.rec_date
AND d7.rec_date<= d6.rec_date="" +="">=>
WHERE d5.rec_id = '5'
AND d6.rec_id = "6"
AND d7.rec_id = "7"
)
SELECT emp_id, date_1, date_2, date_3
OF joined_data
WHERE r_num = 1
;
The subquery joined_data find all combinations of rows that meet the criteria. We want to only 1 line by emp_id, so I used ROW_NUMBER assign unique r_nums (starting at 1) to all lines with the same emp_id and then, in the main query, rejected all but the 1st row.
Knapen had a good idea, but it won't work for all cases. There may be situations where the only combination of rows that meet the criteria does not use the MIN or MAX of dates of one (or several).
Tags: Database
Similar Questions
-
compare the data and the output data that do not exist
Hello
I've written a procedure to insert data into a table 3 where I compare the data between two tables, if it matches it insert in the table test_a Joanie. If the exists not or other tables i.e. test_code and test_type it should output this data, where there is no. my code works for a single table, which is test_code. It's not DBMS display a line that is not in the table test_type. could just tell my why? Assume that if test_code a line which is only not in test_type it should out saying this line of incompatibilities with test_type and vice versa.
-Here's my code
Test of CREATE OR REPLACE PROCEDURE. GET_data
IS
BEGIN
DELETE test.test_a;
FOR c IN (select a.cCODE,
a.type,
a.Indicator,
RTrim (xmlagg (xmlelement (e, a.codenum |))) (') a.codenum order) .extract ('/ / text()'), ',') codeNUMber.
b.CCODE cc,
b.type tp,
b.Indicator ind
test.test_code a, test.test_type b
where a.ccode = b.ccode (+)
AND a.type = b.type (+)
AND a.indicator = b.indicator (+)
Group of a.ccode, a.type, a.indicator, b.CCODE, b.type, b.indicator
order of a.ccode)
LOOP
BEGIN
IF (c.cCODE = C.c.c.
AND C.type = C.tp
AND C.indicator = C.ind
AND C.SYS_IND = C.SYSIND) THEN
insert into test.test_a (CCODE, type indicator)
values (C.cCODE, C.type, C.indicator);
ON THE OTHER
dbms_output.put_line (' rules for cCODE issue: ' |) C.cCODE);
dbms_output.put_line ('type: ' |) C.type);
dbms_output.put_line (' indicator: ' |) C.Indicator);
dbms_output.put_line (' problem of rules for CC: ' |) C.C.C.) ;
dbms_output.put_line ('tp: ' |) C.TP);
dbms_output.put_line ('ind: ' |) C.IND);
END IF;
EXCEPTION
WHILE OTHERS THEN
dbms_output.put_line (' rules for cCODE issue: ' |) C.cCODE);
dbms_output.put_line ('type: ' |) C.type);
dbms_output.put_line (' indicator: ' |) C.Indicator);
dbms_output.put_line (' problem of rules for CC: ' |) C.C.C.) ;
dbms_output.put_line ('tp: ' |) C.TP);
dbms_output.put_line ('ind: ' |) C.IND);
END;
end loop;
commit;
END;
/
Thank youYou must use a FULL OUTER JOIN instead an OUTER JOIN for this.
Just curious, why do you need to use dbms_output instead to execute the SQL query with additional conditions (if part of your procedure)?. You can use two times, one to insert those that match and one for the selection of others who do not match.
Kind regards.
-
No need to advise - compare the date in *.sql with sysdate.
Hi guys,.
Need some help here.
Someone has a script that will compare the date specified with the current sysdate. If previously, he will order that SQL * PLUS to leave immediately.
The audit will be essentially in a script *.Sql. Whenever we run the script, @c:\script.sql, it will be first of all to compare the dates and decide whether to proceed with the rest of the codes (dml) below the date checker in the same script.sql
Thank youI would like to combine the solutions of bencol and alberto:
whenever sqlerror exit DECLARE v_date DATE := TO_DATE('
', 'YYYYMMDD'); BEGIN IF v_date >= TRUNC(SYSDATE) -- or perhaps: v_date>= sysdate THEN null; ELSE raise_application_error(-20000,'Date is before SYSDATE!'); END IF; END; / whenever sqlerror continue -- rest of your script ... (not tested)
Published by: hm on 08.05.2012 02:51
-
How do you compare the data collected continuously?
So, I'm stuck on the basic architecture, therefore, hoping that you can push took me.
What I have is a VI that measures the tensions permanently, then, I have a flow of power from DAQ hardware data points. What I WANT is to act on the data points of tension, only, which are larger than the previous points. For example, I want to act on the first data point, since it will be the most important, since there is nothing to compare to, then I want to compare the points of data subsequent to the first, until there is a greater than the first data point. Then, I want to compare tensions the NEW value more and so on, etc. and act only on the NEW larger value.
Consider this list of data points and corresponding outcomes:
2 LAW
4 LAW
3. DO NOTHING
3. DO NOTHING
4-DO NOTHING
5 LAW
4-DO NOTHING
5-DO NOTHING
4-DO NOTHING
3. DO NOTHING
6 LAW
I've been watch combinations of them for WHILE loops and shift registers and the tables, but the table would get so huge so fast and the MIN/MAX value of the TABLE palette function would get pretty slow and I don't need to evaluate all previous data. I just need to be able to identify the highest value and then compare it to the following values until there is a NEW larger value. It's a bit like how the warriors would fight several opponents until they lost and then, there's a new champion, and all subsequent warriors are compared to the new champion and so on and so forth.
You have any suggestions on how to achieve this? I'm puzzled.
Thank you
Dave
Yes, either case will work, I put it in the structure case just to show that you need to put in there if you want to use.
-
Why I need to_char allows to compare the date?
Hi guys:
I have a question that seem silly, but I couldn't know.
I have a simple query on Oracle 11 G R2 and I use SQL developer 3.1.07, the schema and the data has been migrated from a SQL Server:
It returns empty results. However, tuples are in the table. When I try this:select * from vernote where whendate='09-JUL-12';
He returned 677 lines. the whendate data type is date. but when I try another table in the same pattern:select * from vernote where to_char(whendate)='09-JUL-12';
It returns tuples, and I don't have to use the function to_char. transpostdate is also a date. Could someone tell me why the two columns: whendate, transpostdate both are of type date, but I have to use to_char to compare, the other does not?select * from invoices where transpostdate='09-JUL-12';
Thanks in advance!
Samlxiscas wrote:
Hi guys:I have a question that seem silly, but I couldn't know.
I have a simple query on Oracle 11 G R2 and I use SQL developer 3.1.07, the schema and the data has been migrated from a SQL Server:
select * from vernote where whendate='09-JUL-12';
It returns empty results. However, tuples are in the table. When I try this:
select * from vernote where to_char(whendate)='09-JUL-12';
He returned 677 lines. the whendate data type is date. but when I try another table in the same pattern:
select * from invoices where transpostdate='09-JUL-12';
It returns tuples, and I don't have to use the function to_char. transpostdate is also a date. Could someone tell me why the two columns: whendate, transpostdate both are of type date, but I have to use to_char to compare, the other does not?
Thanks in advance!
Sam
What kind of data are WHENDATE & TRANSPOSTDATE?
If they are the data type DATE, then they contain data too part TIME.
NEVER rely on the implicit data type conversion.
July 9, 12 ' is STRING; not a DATEWhen TRUNC (transpostdate) = TO_DATE('09-JUL-2012','DD-MON-YYYY');
-
Compare the date of the day against a date entered
Hello
In my form, I need for the user to enter a 'date needed '. So I need to compare the need of today, and if it is less than 15 days away, I need to display a message: we need more 15 days to respond to your command. »
I found some scripts on the Forum, but none is exactly what I need and I can't find how to modify them for this specific problem. Any help is appreciated.
Thank you
MDawn
OK, you just need to add a script to the output of the dateNeeded field event.
If (date2num ($.formattedValue, "MM/DD/YYYY") lt date() + 15) then
$host.messageBox ("at least 15 days in the future be as date", "entered an incorrect date", 0, 0)
endif
-
By comparing the date to sysdate
I'm trying to compare a date from a database of Oracle (10 g R1) sysdate but does not work.
An equality (=) expression is not evaluated. I always 'The Dates are not equal' when waiting for "the Dates are equal." What is the problem with my PL/SQL?DECLARE v_exit_date DATE; --Let's assume exit_date from the database is today's date '15-APR-10' BEGIN SELECT exit_date INTO v_exit_date FROM TABLE_1 WHERE student_id = 3020; IF v_exit_date = sysdate THEN dbms_output.putline ('Dates are equal'); ELSE dbms_output.putline ('Dates are not equal'); END; END;
Thank you
Published by: Northstar on April 15, 2010 11:32I ran this example below and it does not work on my db:
Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 Connected as fsitja SQL> SQL> set serveroutput on SQL> create table table_1 as select sysdate exit_date, 3020 student_id from dual; Table created SQL> DECLARE 2 v_exit_date DATE; --Let's assume exit_date from the database is today's date '15-APR-10' 3 BEGIN 4 SELECT exit_date 5 INTO v_exit_date 6 FROM TABLE_1 WHERE student_id = 3020; 7 IF TRUNC(v_exit_date) = TRUNC(SYSDATE) 8 THEN dbms_output.put_line ('Dates are equal'); 9 ELSE dbms_output.put_line ('Dates are not equal'); 10 END IF; 11 END; 12 / Dates are equal PL/SQL procedure successfully completed SQL>
-
Calculated in point by comparing the Dates in IR
Someone at - he was able to use a component calculated in IR to compare a date and post something else
example of
If (date > 1 January 2009 ') {1} else {2}
I can not get to post whatever it is as 1 Although I graduate to that date dates in the field that I use to compare. Am I missing something, it seems like it should work, but it doesn't
Any help would be appreciated.
Thank you!!What is source and data type of the area date ?
If it's a Date from the database then you compare a Date into a string. You need to convert one of them to the data of the other type
Try
If (date > ToDate (January 1, 2009 "")) {1} else {2}
-
want to compare the data in excel with real-time signal
Hello
my request is to check the PCB pins of I/o... Firstly I have signal corresponding to each pin in GOOD PCB board and the output of each needle is saved in excel using scripture to the spreadsheet... then the database be act as master for more tips of PCB...
If I want to check the other pcb edge means that the same signals should be send on the pin of each Member of the PCB... received out of the Council should check with the data already stored in the database if this is the way to match status LED should illuminate otherwise is not to shine...
pls help me finish this application... I have attached model vi with poster and Excel in too...
I hate to say it, but you don't have really any type of application there. It is quite difficult to help you complete when you barely started. An express VI couple in a sequence structure do not apply.
What you need to do is sit down and write a design specification. What are your entries for this application? What are your results? What do you think the UI to look like? What steps do you need to do to go from A to B? Chart out.
-
move the data by lines into a 2D array
HI, I have a question about moving the data in a 2D online table, that I was not able to do so if anyone has an answer please let me know
a picture of what im doing is attached as I said
I want '1 and run' online no column, if I change the index of the line it will work but the problem is that the 'run' under the '1' and I don't want if I change the index of the column of labview makes the data like the attached picture, but when I changed the labview index moves the data by column when want per row
Hi, I think that change your code as this will give you the behavior you're looking for.
That being said, your source code is a bit confusing. Why do you have a loop for? If you remove the loop for example, the code will do exactly the same thing.
Kind regards
-
I need to compare rows of data and need help.
WHEN TYPE (is the same)
And THEN (beginning - end of the #1 ticket #2 Ticket) (if negative, 1)
OTHERWISE NULL END
Ticket #_Tyoe__Start __End_Test
1___one___2:00__3:00_0_
2___one___3:00__4:00_0_
3___one___2:30__3:30_1_
Basically, I need to know when the start and end times overlap when the type is the same.
Any help is appreciated. NO MATTER WHAT.You must have the Ticket # 1Statut somewhere, can go for a logical column with ex
CASE WHEN TICKET = 2 THEN THE END OF THE STATEIf state you your question, we can help you more in detail
-
By comparing the date with the BIGGEST rows
Hi all
Why don't the last statement asking all values?
Suppose that:
I try to get the biggest date of temp_date column of the table of test, but instead, I myself dump of null values. What has gone wrong?SQL> select * from test; TEMP_DATE --------- 14-APR-11 15-APR-11 16-APR-11 SQL> select months_between(to_date((select temp_date from test where rownum=1)),to_date((select temp_date from test where rownum=2)))test from test; TEST ----------
Is there a way more easy to compare these values using GREATEST (I can do that easily with the MAX function however)?
Best regards
TA.
Published by: Valerie good-natured April 14, 2011 20:48Hi, Val,
Valerie Debonair wrote:
... I try to get the largest temp_date column of the table of test date...The simplest approach, which is
SELECT MAX (temp_date) AS greatest_date FROM test;
but instead, I got dump of null values. What has gone wrong?
As someone has already said, ROWNUM = 2 will never be TRUE. ROWNUM is 1 until a line was selected; then only does ROWNUM get incremented to 2.
Is there a way more easy to compare these values using GREATEST (I can do that easily with the MAX function however)?
To use the LARGER, you will need to rotate all values not NULL on a single line. It's a very bad idea. In fact, people sometimes unpivot data just so that they can use MAX instead of GREAT.
Why do you want to do more BIG?
If you use it, be careful for NULL values, because BIGGER returns NULL if one of its arguments is NULL. -
by comparing the data in the columns using SUBSTR
I have a column with a (VARCHAR2) number of cases and a column with a year (NUMBER) composed of similar data to:
CASENUMBER - YEAR
199713029 97
199713678 97
199713691 97
199713709 97
199713844 97
199714141 97
2001002718 01
2001002725 01
2001002894 01
95 U 9998-----------------------------------95
95 U 9999-----------------------------------95
96 A 0019-----------------------------------96
96 A 0058-----------------------------------96
96 A 0067-----------------------------------96
When I run this query:
I get this result:SELECT SUBSTR(LOCCASENUM,1,4) as FIRST_FOUR,SUBSTR(YEAR,1,2)as "test" FROM DATA_TABLE where SUBSTR(LOCCASENUM,1,4) != SUBSTR(YEAR,1,2)
FIRST FOUR - test_
1997 97
1997 97
1997 97
1997 97
1997 94
1997 97
2001 1
2001 1
2001 4
U - 95 95
U - 95 95
96 96
96 96
96 93
What I am wanting to do is to compare these two columns and display the ones who do not match. I don't know if I should do a LPAD on the year column or what. Can anyone help? Thank you
DeannaHello
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 Connected as hr SQL> SQL> with data as( 2 select '199713029 ' as casenumber, 96 as year from dual union all 3 select '199713678 ' as casenumber, 97 as year from dual union all 4 select '199713691 ' as casenumber, 97 as year from dual union all 5 select '199713709 ' as casenumber, 97 as year from dual union all 6 select '199713844 ' as casenumber, 97 as year from dual union all 7 select '199714141 ' as casenumber, 97 as year from dual union all 8 select '2001002718' as casenumber, 01 as year from dual union all 9 select '2001002725' as casenumber, 01 as year from dual union all 10 select '2001002894' as casenumber, 01 as year from dual union all 11 select '95 U 9998 ' as casenumber, 95 as year from dual union all 12 select '95 U 9999 ' as casenumber, 95 as year from dual union all 13 select '96 A 0019 ' as casenumber, 96 as year from dual union all 14 select '96 A 0058 ' as casenumber, 96 as year from dual union all 15 select '96 A 0067 ' as casenumber, 96 as year from dual) 16 select * from data where case length(substr(regexp_substr(casenumber, '[0-9]+'),1,4)) when 2 then substr(regexp_substr(casenumber, '[0-9]+'),1,4) else substr(regexp_substr(casenumber, '[0-9]+'),3,2) end = year; CASENUMBER YEAR ---------- ---------- 199713678 97 199713691 97 199713709 97 199713844 97 199714141 97 2001002718 1 2001002725 1 2001002894 1 95 U 9998 95 95 U 9999 95 96 A 0019 96 96 A 0058 96 96 A 0067 96 13 rows selected SQL>
Kind regards
-
Comparing the data set of Oracle database local to the Remote SQL Server database
Hello
I have a table in an Oracle database that is gradually being updated with a table in SQL server through the database link. There is a field "Date of creation" in the table in SQL server that I used to find the newly created records and shoot and insert them into the local table to the Oracle database.
Now the question is the documents/data in the SQL server remote can be deleted as well and I see a lot of files are already deleted and I couldn't find a way to capture the information of deleted data to remove from my local table.
I tried
SELECT id local_table
where there is no
(select * (or 1))
of remote_table@database_link
where remote_table.id = local_table.id).
And I tried to replace not exist with no so.
The problem is that the query is too slow with link of database for IN/NOT EXISTS clause NO. So, I'm trying to find an effective way to capture the lines deleted in the remote to remove as a result of my local table table.
Any help is appreciated.
Oracle Database 11 g Enterprise Edition Release 11.2.0.2.0 - 64 bit
Thank you
Chrystelle
It is perhaps easier
Select pk / * or sustitutive key * / from Oracle.tba
less
Select pk / * or sustitutive key * / from SQLSERVER.tab
This returns the rows that exist in Oracle but not in SQL SERVER-> delteted lines in SQL Server.
Another way is to create a trigger to remove in sqlserver and track in a table delete lines.
HTH - Antonio NAVARRO
-
By comparing the Date with timestamp without time portion
Hello
I have table lets say rates, it has a field called expire_date. Now, I need to display the records in this table which expires date is greater than today. Can someone tell me how to do?
Currently, I do like this:
Select * rate where expire_date > = (select SYSDATE from DOUBLE);
This request is now selection of records whose timestamp is greater than the current date and time and other drops while the expire_Date is today with less time stamp.
I need to show the records that are valid today and coming dates regardless of today
Kind regards
Ashish
Select * rate where expire_date > = trunc (sysdate);
Avoid the misuse of the double
Kind regards
Maybe you are looking for
-
printer says offline on my HP Photosmart C4380
I have a HP Photosmart C4380 and I have problems with it being offline. I followed all of the steps this site told me to do and it remains offline. When I run the diagnostic utility program, he is told that he is online and told me everything is ok,
-
Windows Vista Home Premium... always had my google deskbar appear in the taskbar at startup. He disappeared a few months ago how I get it back? Happened once before and appeared one day on its own. Is not the case this time.
-
BlackBerry Smartphones how often check-in BIS with Exchange?
Forgive me, I'm sure that this topic has been covered, but I can't find the white paper on it. I have a client who has many employees with blackberries, but they refuse to shell out money for a BES. So unfortunately, I can't support them with BIS. I
-
The license may not my paid subscription! Expired subscription WARNING!
-
How can I stop lightroom to change my images when I preview them for editing?
I am so annoyed, it was a series of questions for months now surrounding the program itself and my ridiculous HP computer, and once I've stumbled into a magical Portal online adobe which I linked to a number of technician of customer service where a