SQL Server:使用ROW\ U NUMBER和CASE语句选择行
我得到了一个子表数据,如下所示:SQL Server:使用ROW\ U NUMBER和CASE语句选择行,sql,sql-server,sql-order-by,case,row-number,Sql,Sql Server,Sql Order By,Case,Row Number,我得到了一个子表数据,如下所示: 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-
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
和父表如下所示:
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
现在,我试图根据DESC上更新的_,在Child Id的(16、12、13、7)行的前1行中仅获取非激活的_,因为存在重复的Id。结果也需要检查
- 案例1:如果父Id的类型_Id=2,则禁用的_On为NULL,并且
- 案例2:当父Id的类型_Id=1时,则未激活的_On为NULL,并且给定数据不应将父Ans值设置为“false”
- 案例3:当子行和父行未激活的_On为空时,则从最终结果集中排除
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正常工作。非常感谢您的帮助。按从分区中删除ct.id,并按项目顺序将ct.cust\u id放入分区中
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
你失去了我在“7”被灭活。我不明白。@GordonLinoff我想我忘了添加另一个案例,当子行和父行的unactivated_On为NULL时,则从最终结果集中排除。还有更新的问题。在这个场景中有人能帮我吗?我非常需要它。我提供的数据只是其中的一部分,所以我需要按ct.id进行分区,以便执行进一步的操作。任何帮助,以上似乎对我不起作用