SQL Server: ВЫБЕРИТЕ строки, используя оператор ROW_NUMBER и CASE - PullRequest
3 голосов
/ 19 мая 2019

Я получил данные дочерней таблицы следующим образом:

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

Теперь я пытаюсь получить только строки Inactivation_On Child Id (16, 12, 13, 7), первые 1 на основе Upd_on DESC, так как есть повторяющиеся идентификаторы. Результат также нужно проверить

  • Случай 1: если Type_Id родительского идентификатора = 2, то Inactivation_On равно NULL и
  • Случай 2: когда Type_Id родительского идентификатора = 1, тогда значение Inactivation_On равно NULL, и данные данные не должны иметь родительское значение Ans как 'false'
  • Случай 3: когда дочерняя и родительская строки Inactivation_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

Я ищу запрос, чтобы заставить работать дела 1 и 2. Любая помощь очень ценится.

1 Ответ

0 голосов
/ 19 мая 2019

удалить ct.id из раздела и поместить ct.cust_id в раздел с помощью 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
...