2017-10-06 127 views
0

我有一个表与下面的模式 TableReassignment如何获得最后的记录?

Id 
StepId 
FromUserId 
ToUserId 

示例数据对于TableReassignment:有可能或可能不适合特定步骤的任何记录

1 , Step1 , UserA, UserB 
2 , Step1 , UserB, UserC 
3 , Step1 , UserC, UserD 
4 , Step1 , UserD, UserE 
5 , Step1 , UserF, UserG 
6 , Step2 , UserB, UserC 
7 , Step2 , UserC, UserD 
8 , Step2 , UserE, Userf 

而且用户表

UserId 
UserName 

也StepUserDetails

StepId, 
StepUserId 

示例数据StepUserDetails:

Step1, UserA 
Step2, UserB 
Step3, UserC 
Step4, UserD 

我的要求是,我想与现有StepUsers StepUserDetails,如果他们被重新分配,那么最后重新分配用户。

预期的输出应该像

Step1, UserG 
Step2, UserF 
Step3, UserC 
Step4, UserD 
+2

除非我不明白你的问题提得好:'SELECT TOP 1 * FROM表WHERE StepId = '第一步' 订单来自序号desc' – Jacky

+0

编辑后提出的问题与原始版本中提出的问题有所不同。你能否提供预期的产出? –

+0

@GiorgosBetsos检查更新了一个 – Trikaldarshi

回答

1

您可以使用下面的查询:

WITH ReassignmentCTE AS (
    SELECT StepId, ToUserId, 
      ROW_NUMBER() OVER(PARTITION BY stepId ORDER BY Id DESC) AS rn 
    FROM Reassignment 
)  
SELECT s.StepId, COALESCE(c.ToUserId, s.StepUserId) AS StepUserId 
FROM StepUserDetails AS s 
LEFT JOIN ReassignmentCTE AS c ON s.StepId = c.StepId AND c.rn = 1 

Demo here

+0

是的,正是我的意思,我不明白为什么这个需要变得复杂,只需要按id排序并获得第一条记录 - 就像我的评论。除非我没有得到OP的意思 – Jacky

1

你可以使用子查询

select ToUserId 
    from my_table where Id =(
    select max(Id) 
    from my_table 
    where stepId='Step1' 
) 

或加入

select ToUserID 
    from my_table 
    inner Join (
     select StepId, max(Id) my_id 
     from my_table 
     group by StepId 
) t on t.my_id = my_table.Id and StepId ='Step1' 

,并为您更新的问题

select a.StepID, a.ToUserID 
    from my_table a 
    inner Join (
     select StepId, max(Id) my_id 
     from my_table 
     group by StepId 
) t on t.my_id = a.Id 
+0

我已经更新了我的问题,要求有点不同。 – Trikaldarshi

+0

@Trikaldarshi回答更新 – scaisEdge

相关问题