SQL Server: 使用ROW_NUMBER和CASE语句进行行选择

3
我得到了一个子表数据如下:
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

并且父表如下:

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

现在,我正在尝试基于Updated_on DESC获取仅Inactivated_On Child Id's(16, 12, 13, 7)的首行,因为存在重复的Id。结果还需要检查以下内容:

  • 情况1:如果父Id的Type_Id = 2,则Inactivated_On为NULL
  • 情况2:当父Id的Type_Id = 1时,Inactivated_On为NULL且给定数据不应具有parent Ans值为'false'
  • 情况3:当Child和parent行的Inactivated_On为NULL时,则从最终结果集中排除

我的最终期望结果应为:

 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

我尝试的查询是:
 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

我正在寻找一个查询来使Case 1和2正常工作。非常感谢任何帮助。


你说"7"被禁用,我有点听不懂了。 - Gordon Linoff
@GordonLinoff 我想我忘记添加另一个情况了,即当Child和Parent行的Inactivated_On为NULL时,则从最终结果集中排除。同时更新问题。 - Danny
有人能在这种情况下帮助我吗?我非常需要它。 - Danny
1个回答

0
将ct.id从partition by中移除,并将ct.cust_id与item_order一起放入partition。
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

我提供的数据只是其中的一部分,所以我需要按照ct.id进行分区,以便我可以执行进一步的操作。任何帮助,以上方法似乎对我不起作用。 - Danny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接