Friday, March 30, 2007

Finding your left and right neighboring rows using a temp table


/* declare variables */
DECLARE @userID INT
DECLARE @maxCnt INT
DECLARE @tmpUser TABLE (tmpId INT IDENTITY(0,1), UserID INT)

/* quick way to limit to one user */
SET @userID = 223

/* populate the temp table */
INSERT INTO @tmpUser (UserId)
SELECT UserId FROM users

/* find max value for modulo math */
SELECT @maxCnt = COUNT(userid) FROM @tmpUser

--select * from @tmpUser

/* join against orginal data, using mod math and tmp table */

SELECT u.UserId, l.UserId, r.UserId
FROM users AS us
left join @tmpUser AS u ON u.userid = us.userid
left join @tmpUser AS l ON ((u.tmpId - 1 + @maxCnt) % @maxCnt) = l.tmpId
left join @tmpUser AS r ON ((u.tmpId + 1)% @maxCnt) = r.tmpId
WHERE us.userID = @UserID