始终以特定顺序获取 3 条记录

Ang*_*nga 3 sql-server sql-server-2008-r2 sql-server-2012

我有一个查询,可以获取 3 本书(ABC1、ABC2、ABC3)及其详细信息。我需要它们按特定顺序进行旋转,因此我有一个相同的行号列。人们不读/一些/所有的书。

桌子:

StudentID|||BookName|||RowNumber
1000|||ABC1|||27
1000|||ABC2|||31
1000|||ABC3|||28
1005|||ABC2|||28
1005|||ABC3|||20
1005|||ABC1|||25
1006|||ABC1|||12
1006|||ABC2|||14
1006|||ABC3|||15
Run Code Online (Sandbox Code Playgroud)

所以我的数据会像上面那样。我需要为每个学生,ABC1,ABC2,ABC3 应该按顺序和 Rownumber 按降序更新。所以对于学生 1000:

ABC1||27,ABC2||28,ABC3||31
Run Code Online (Sandbox Code Playgroud)

对于学生 1005:

ABC1||20,ABC2||25,ABC3||28
Run Code Online (Sandbox Code Playgroud)

对于 1006:没有变化(它们的顺序已经正确)。

我将上述所有数据放入一个临时表中,并将主数据放入另一个临时表中。我正在尝试编写更新语句,但没有按预期工作。我需要帮助。

Aar*_*and 7

CREATE TABLE #t(StudentID INT, BookName VARCHAR(10), RowNumber INT);

INSERT #t(StudentID,BookName,RowNumber) VALUES
(1000,'ABC1',27),    (1000,'ABC2',31),    (1000,'ABC3',28),
(1005,'ABC2',28),    (1005,'ABC3',20),    (1005,'ABC1',25),
(1006,'ABC1',12),    (1006,'ABC2',14),    (1006,'ABC3',15);

;WITH x AS 
(
  SELECT StudentID, BookName, RowNumber, 
   rn1 = ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY BookName),
   rn2 = ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY RowNumber)
  FROM #t
)
SELECT x.StudentID, x.BookName, y.RowNumber
 FROM x INNER JOIN x AS y
  ON x.StudentID = y.StudentID
  AND x.rn1 = y.rn2
ORDER BY x.StudentID, x.rn1;
GO

DROP TABLE #t;
Run Code Online (Sandbox Code Playgroud)

结果:

CREATE TABLE #t(StudentID INT, BookName VARCHAR(10), RowNumber INT);

INSERT #t(StudentID,BookName,RowNumber) VALUES
(1000,'ABC1',27),    (1000,'ABC2',31),    (1000,'ABC3',28),
(1005,'ABC2',28),    (1005,'ABC3',20),    (1005,'ABC1',25),
(1006,'ABC1',12),    (1006,'ABC2',14),    (1006,'ABC3',15);

;WITH x AS 
(
  SELECT StudentID, BookName, RowNumber, 
   rn1 = ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY BookName),
   rn2 = ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY RowNumber)
  FROM #t
)
SELECT x.StudentID, x.BookName, y.RowNumber
 FROM x INNER JOIN x AS y
  ON x.StudentID = y.StudentID
  AND x.rn1 = y.rn2
ORDER BY x.StudentID, x.rn1;
GO

DROP TABLE #t;
Run Code Online (Sandbox Code Playgroud)