2014-09-11 91 views
0

尝试根据用户标识查找3行。基于ID的SQL偏移量

87. John Snow 1000p 
88. YOU 990p 
89. Jane Doe 900p 

我已经存储在@currentUser用户变量和使用下面的查询,该查询获取所有有关的行动:

结果应与当前用户和行之前和之后所抵消

SELECT u.UserID, 
     u.ContentID, 
     (u.FirstName + ' ' + u.LastName) AS theUser, 
     SUM(l.Action) as thePoints 
FROM [AccessLog] l 
     LEFT JOIN [User] u 
      ON l.UserID = u.UserID 
WHERE l.Action = 13 
     OR l.Action = 2 
     AND l.Timestamp BETWEEN CONVERT(datetime, '2014-09-01') AND CONVERT(datetime, '2014-09-11') 
GROUP BY u.UserID, 
     u.ContentID, 
     u.FirstName, 
     u.LastName 
ORDER BY thePoints DESC 

我将如何去列出例如。 #87到#89如果我的地方是#88?

+0

你在说用户名的? – Azar 2014-09-11 09:51:42

+0

基于非标准语法添加SQL Server – 2014-09-11 09:52:44

回答

1

你应该看看OFFSETFETCH FIRST,但我相信它取决于你使用的数据库版本。

SELECT u.UserID, 
     u.ContentID, 
     (u.FirstName + ' ' + u.LastName) AS theUser, 
     SUM(l.Action) as thePoints 
FROM [AccessLog] l 
     LEFT JOIN [User] u 
      ON l.UserID = u.UserID 
WHERE l.Action = 13 
     OR l.Action = 2 
     AND l.Timestamp BETWEEN CONVERT(datetime, '2014-09-01') AND CONVERT(datetime, '2014-09-11') 
GROUP BY u.UserID, 
     u.ContentID, 
     u.FirstName, 
     u.LastName 
ORDER BY thePoints DESC 
offset 87 rows 
fetch first 3 rows only 
+0

如果在查询运行之前未知位置。这将如何成为可能?用户可以位于7或87. – 2mas 2014-09-11 11:16:09

+0

您可以创建一个参数“@ position”并用提供的人员的位置填充该参数,然后将“OFFSET 87 ROWS”更改为“OFFSET(@position - 1 )行“ – talegna 2014-09-11 13:30:51