If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > Database Server Software > DB2 > query returns latest date row

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 11-23-11, 09:52
Billa007 Billa007 is offline
Registered User
 
Join Date: Sep 2011
Posts: 107
query returns latest date row

Hi;


The below query gives the latest date row..My requirement is like below
Code:
SELECT CD_PLT
     , PRE_NAME
     ,IN_DT
     ,OUT_DT_FLAG
  
 FROM  (
        SELECT T1.CD_PLT
             , T1.PRE_NAME
             , T2.IN_DT
             ,case when(T2.IN_DT > '2012-12-31')
               then 'y'
               else 'N'
               end OUT_DT_FLAG 
              
        
             , ROW_NUMBER()
                  OVER(PARTITION BY T1.CD_PLT, T1.PRE_NAME
                           ORDER BY T2.IN_DT DESC) AS rn
         FROM  TABLE1 T1
  LEFT OUTER JOIN
               TABLE2 T2
ON
    T1.CD_PLT=T2.CD_PLT
    T1.PRE_NAME=T2.PRE_NAME  

             
       ) s  
 WHERE rn = 1
;
The below query gives the latest date row..My requirement is like below

If the T2.IN_DT has two records like less than and greater than of 2012-12-31 means,
we have to display the less than IN_DT record, at the same time the OUT_DT_FLAG will be setting
the value 'Y' else 'N'

If the T2.IN_DT has only greater date means,the T2.IN_DT will be setting empty and the OUT_DT_FLAG will be setting 'Y'

Input Table

Code:
CD_PLT         PRE_NAME      IN_DT             
----------- ------------ --------------  
ABACC            6065        2013-01-13    
ABACC            6065        2011-01-11     
ABACC            6077        2011-01-12 
ABACC            6077        2012-01-10    
ABACC            6000        2011-10-09  
ABACC            6000        2010-11-10 
ABACC            6000        2009-11-11     
BBBBB            7777        2015-02-22
BBBBB            7777        2014-01-21
MY QUERY RETURNS LIKE BELOW

Code:
CD_PLT         PRE_NAME      IN_DT       OUT_DT_FLAG          
----------- ------------ --------------  --------------- 
ABACC            6065        2013-01-13     Y 
ABACC            6077        2012-01-12     Y
ABACC            6000        2011-10-09     N
BBBBB            7777        2015-02-22     Y
EXPECTED RESULT

Code:
CD_PLT         PRE_NAME      IN_DT       OUT_DT_FLAG          
----------- ------------ --------------  --------------- 
ABACC            6065        2011-01-11     Y 
ABACC            6077        2011-01-12     Y
ABACC            6000        2011-10-09     N
BBBBB            7777                       Y
Please help
Reply With Quote
  #2 (permalink)  
Old 11-23-11, 10:57
tonkuma tonkuma is online now
Registered User
 
Join Date: Feb 2008
Location: Japan
Posts: 2,193
Please write basic information by referencing Must Read before posting.
For example:
Quote:
1) Every question posted must include your DB2 Version, fixpack and Edition + your Operating System(including version info) + info on any third party software you use.

I thought that your descriptions were incomplete and inconsistent.

For example:
1) Although there were TABLE1 and TABLE2 in your code,
you showed sample data of "Input Table".

2)
Quote:
If the T2.IN_DT has two records like less than and greater than of 2012-12-31 means,
we have to display the less than IN_DT record, ...

If the T2.IN_DT has only greater date means,the T2.IN_DT will be setting empty ...
These two rows are both less than 2012-12-31, but you showed only 2011-01-12 in EXPECTED RESULT.
Code:
ABACC            6077        2011-01-12 
ABACC            6077        2012-01-10
No description for the condition two(or more) rows are both less than 2012-12-31.
No description the reason to exclude 2012-01-10.
Reply With Quote
  #3 (permalink)  
Old 11-24-11, 04:52
Billa007 Billa007 is offline
Registered User
 
Join Date: Sep 2011
Posts: 107
Hi;

Db2Version is
DB2 SQL PRECOMPILER VERSION 9 REL. 1.0

1.Input Table..I was just taking the sample records of after JOINS

2.Apology for that...I could have missed to type the reason

Code:
ABACC            6077        2011-01-12 
ABACC            6077        2012-01-10-->lessthan of 2012-12-31 & latest
for the above two records ...Need to select the latest record and should return to the Expected Result...

To fetch one latest IN_DT record for each CD_PLT,PRE_NAME,I was using the DESC IN_DT and ROW_NUMBER() code

Table1
Code:
CD_PLT         PRE_NAME                   
----------- ------------   
ABACC            6065        
ABACC            6065         
ABACC            6077       
ABACC            6077          
ABACC            6000         
ABACC            6000       
ABACC            6000            
BBBBB            7777        
BBBBB            7777
TABLE2
Code:
CD_PLT         PRE_NAME      IN_DT             
----------- ------------ --------------  
ABACC            6065        2013-01-13    
ABACC            6065        2011-01-11 -->lessthan of 2012-12-31 & latest
    
ABACC            6077        2012-01-10 -->lessthan of 2012-12-31 & latest   
ABACC            6077        2011-01-12 

ABACC            6000        2011-10-09  -->lessthan of 2012-12-31 & latest
ABACC            6000        2010-11-10 
ABACC            6000        2009-11-11     

BBBBB            7777        2015-02-22
BBBBB            7777        2014-01-21
EXPECTED RESULT SET
Code:
CD_PLT         PRE_NAME      IN_DT       OUT_DT_FLAG          
----------- ------------ --------------  --------------- 
ABACC            6065        2011-01-11     Y 
ABACC            6077        2011-01-12     N
ABACC            6000        2011-10-09     N
BBBBB            7777                   Y
Please help;
Reply With Quote
  #4 (permalink)  
Old 11-24-11, 07:56
tonkuma tonkuma is online now
Registered User
 
Join Date: Feb 2008
Location: Japan
Posts: 2,193
Note 1: IN_DT of second row of EXPECTED RESULT SET was 2011-01-12.
But, comment in TABLE2 showed
Code:
ABACC            6077        2012-01-10 -->lessthan of 2012-12-31 & latest
I took 2012-01-10

Note 2: rnum is used to make order of result rows same as your EXPECTED RESULT SET.
But, it is not guaranteed.

Example 1:
Code:
------------------------------ Commands Entered ------------------------------
WITH
 Table1(CD_PLT , PRE_NAME) AS (
VALUES
  ( 'ABACC' , 6065 )
, ( 'ABACC' , 6065 )
, ( 'ABACC' , 6077 )
, ( 'ABACC' , 6077 )
, ( 'ABACC' , 6000 )
, ( 'ABACC' , 6000 )
, ( 'ABACC' , 6000 )
, ( 'BBBBB' , 7777 )
, ( 'BBBBB' , 7777 )
)
, Table2(CD_PLT , PRE_NAME , IN_DT) AS (
VALUES
  ( 'ABACC' , 6065 , '2013-01-13' )
, ( 'ABACC' , 6065 , '2011-01-11' )
, ( 'ABACC' , 6077 , '2012-01-10' )
, ( 'ABACC' , 6077 , '2011-01-12' )
, ( 'ABACC' , 6000 , '2011-10-09' )
, ( 'ABACC' , 6000 , '2010-11-10' )
, ( 'ABACC' , 6000 , '2009-11-11' )
, ( 'BBBBB' , 7777 , '2015-02-22' )
, ( 'BBBBB' , 7777 , '2014-01-21' )
)
SELECT cd_plt
     , pre_name
     , in_dt
     , CASE
       WHEN in_dt IS NULL THEN 'Y'
       WHEN rnum2 = 1     THEN 'N'
       ELSE                    'Y'
       END  AS out_dt_flag
 FROM  (SELECT t.*
             , ROW_NUMBER()
                  OVER( PARTITION BY cd_plt , pre_name
                            ORDER BY in_dt DESC  NULLS LAST
                      ) rnum1
             , ROW_NUMBER()
                  OVER( PARTITION BY cd_plt , pre_name
                            ORDER BY in_dt DESC  NULLS FIRST
                      ) rnum2
         FROM  (SELECT t1.cd_plt
                     , t1.pre_name
                     , CASE
                       WHEN t2.in_dt <= '2012-12-31' THEN
                            t2.in_dt
                       END  AS in_dt
                     , rnum
                 FROM  table1 t1
                 LEFT  OUTER JOIN
                       (SELECT t2.*
                             , ROW_NUMBER() OVER() AS rnum
                         FROM  table2 t2
                       ) t2
                   ON  t2.cd_plt   = t1.cd_plt
                   AND t2.pre_name = t1.pre_name
               ) t
       ) s
 WHERE rnum1 = 1
 ORDER BY
       rnum
;
------------------------------------------------------------------------------

CD_PLT PRE_NAME    IN_DT      OUT_DT_FLAG
------ ----------- ---------- -----------
ABACC         6065 2011-01-11 Y          
ABACC         6077 2012-01-10 N          
ABACC         6000 2011-10-09 N          
BBBBB         7777 -          Y          

  4 record(s) selected.
Reply With Quote
  #5 (permalink)  
Old 11-24-11, 09:56
tonkuma tonkuma is online now
Registered User
 
Join Date: Feb 2008
Location: Japan
Posts: 2,193
The result of your join contains redundant rows(two or three in your sample data).

So, it is better to add some more condition to ON clause
or remove redundant rows from table1.
(I guessed table1(and table2?) might be result of a subquery or a view,
because duplicated rows exists.)

You may want to change the query to produce table1 to remove the redundant rows.


Here is the result of a query removing outer most WHERE clause from Example 1.

Example 2:
Code:
------------------------------ Commands Entered ------------------------------
/* same as example 1 except commented out WHERE clause */
       ) s
-- WHERE rnum1 = 1
 ORDER BY
       rnum
;
------------------------------------------------------------------------------

CD_PLT PRE_NAME    IN_DT      OUT_DT_FLAG
------ ----------- ---------- -----------
ABACC         6065 -          Y          
ABACC         6065 -          Y          
ABACC         6065 2011-01-11 Y          
ABACC         6065 2011-01-11 Y          
ABACC         6077 2012-01-10 N          
ABACC         6077 2012-01-10 Y          
ABACC         6077 2011-01-12 Y          
ABACC         6077 2011-01-12 Y          
ABACC         6000 2011-10-09 N          
ABACC         6000 2011-10-09 Y          
ABACC         6000 2011-10-09 Y          
ABACC         6000 2010-11-10 Y          
ABACC         6000 2010-11-10 Y          
ABACC         6000 2010-11-10 Y          
ABACC         6000 2009-11-11 Y          
ABACC         6000 2009-11-11 Y          
ABACC         6000 2009-11-11 Y          
BBBBB         7777 -          Y          
BBBBB         7777 -          Y          
BBBBB         7777 -          Y          
BBBBB         7777 -          Y          

  21 record(s) selected.
Reply With Quote
  #6 (permalink)  
Old 11-24-11, 10:04
Billa007 Billa007 is offline
Registered User
 
Join Date: Sep 2011
Posts: 107
Great Tonkuma...thanks...working fine...
Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On