简体   繁体   中英

SQL Server: SELECT rows using ROW_NUMBER and CASE statement

I got a child table data as follows:

Id  Cust_id Item_Id  Inactivated_On       Updated_on           Ans
-----------------------------------------------------------------------
15    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  true
16    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  123
11    123     541    NULL                 2014-05-18 08:44:00  NULL
12    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  NULL
13    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  false
6     123     541    NULL                 2014-05-18 08:44:00  NULL
7     123     541    NULL                 2014-05-18 08:44:00  NULL
15    123     541    NULL                 2014-05-18 08:44:00  false

and parent table as follows:

Id   Parent_Id   Type_Id
-------------------------
15    NULL        1
16    15          2
11    NULL        2
12    11          2
13    11          1
 6     NULL        2
 7     6           2

Now, I'm trying to get only Inactivated_On Child Id's(16, 12, 13, 7) rows top 1 based on Updated_on DESC as there are repetitive Id's. The result should also need to check

  • Case 1: if parent Id's Type_Id = 2 then Inactivated_On is NULL and
  • Case 2: when parent Id's Type_Id = 1 then the Inactivated_On is NULL and the given data should not have parent Ans value as 'false'
  • Case 3: when Child and parent row Inactivated_On is NULL then exclude from the final result set

My final expected result should be:

 Id  Cust_id Item_Id  Inactivated_On       Updated_on           Ans
 -------------------------------------------------------------------
 12    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  NULL
 13    123     541    2014-05-18 08:44:00  2014-05-18 08:44:00  false

The query that I have tried is:

 SELECT 
     CH.Id,
     CH.Cust_id, 
     CH.Item_Id,  
     CH.Inactivated_On,       
     CH.Updated_on,           
     CH.Ans,
     CH.RN
     (SELECT 
          ROW_NUMBER() OVER (PARTITION BY CT.Item_Id, CT.Id ORDER BY CT.Updated_on DESC) AS RN,
          CT.Id,
          CT.Cust_id, 
          CT.Item_Id,  
          CT.Inactivated_On,       
          CT.Updated_on,           
          CT.Ans
      FROM 
          CHILD_TBL AS CT
      INNER JOIN 
          PARENT_TBL AS PT ON PT.Id = CT.Id
      WHERE 
          PT.Parent_Id IS NULL
          CT.Inactivated_On IS NOT NULL -- FOR CASE 3 FILTERING
          AND CT.Cust_id = 123
          AND CT.Item_Id = 541) AS CH
WHERE 
    CH.RN = 1

I'm looking for a query to get Case 1 and 2 working. Any help is much appreciated.

remove ct.id from partition by and put ct.cust_id in partition with item_order

SELECT CH.Id,
  CH.Cust_id, 
  CH.Item_Id,  
  CH.Inactivated_On,       
  CH.Updated_on,           
  CH.Ans
  (SELECT ROW_NUMBER() OVER (PARTITION BY CT.Item_Id, CT.cust_id ORDER BY 
   CT.Updated_on DESC) AS RN,
   CT.Id,
   CT.Cust_id, 
   CT.Item_Id,  
   CT.Inactivated_On,       
   CT.Updated_on,           
   CT.Ans
   FROM CHILD_TBL AS CT
   INNER JOIN PARENT_TBL AS PT ON PT.Id = CT.Id
   WHERE PT.Parent_Id IS NULL
   AND CT.Cust_id = 123
    AND CT.Item_Id = 541
   ) AS CHLD
  WHERE CH.RN = 1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM