如何在SQL Server中按播放器获取第二行值并将其插入其他表中。
例如,我将有这样的表格:
PlayerId VIpLevel StartDate
1 1 2000-01-01 00:10
1 4 2001-01-01 00:10
1 5 2001-01-11 00:10
2 1 2000-01-01 00:10
2 3 2000-01-02 00:10
2 7 2000-05-02 00:10
所以我想通过StarDate DESC为玩家1和玩家2获得他们的第二个VipLevel订单。
到目前为止,我找到了这个,但这对我来说并不好
UPDATE #Results
SET [PreviousVIPLevel] = (
SELECT
ROW_NUMBER() OVER(ORDER BY StartDate DESC) AS RowNum,
PlayerId,
VIPLevelId
FROM #table
) foo
WHERE RowNum =2
我假设你的#Results
表中有一个playerid
,所以你可以用他们的第二高等级更新每个球员的记录。然后,您需要在row_number
函数中使用partition by
并相应地join
:
UPDATE A
SET PreviousVIPLevel= B.VIPLevelId
FROM #Results A
JOIN (SELECT
ROW_NUMBER() OVER(PARTITION BY PlayerId ORDER BY StartDate DESC) AS RowNum,
PlayerId,
VIPLevelId
FROM #table
) B ON A.PLayerId = B.PlayerId AND B.RowNum = 2
由于多种原因,当前查询无法正常工作。 首先,不能更新选择多个列的字段。 这就是为什么我改用join
。 其次,如果您能够使你的记录工作,它会将所有记录更新为相同的值,因为您缺少partition by
子句。
实际上不涉及更新。这是一个插入语句。假设创建了目标表:
WITH CTE AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY PlayerId ORDER BY StartDate DESC) AS RowNum,
PlayerId,
VIPLevelId
FROM #table
)
INSERT INTO Destination
SELECT * FROM CTE WHERE RowNum = 2