我有一张表格,里面有不同问题的答案,所有问题都有编号。基本上有以下列:class Foo {
get bar() { return this._bar };
set bar(val) { this._bar = val };
}
Foo.prototype._bar = 0;
(表中每个答案都是唯一的),IdAnswer
(即使同一用户第二次回答问题也不会重复),IdUser
和IdQuestion
。
Answer
我想从此表中选择特定问题的所有答案(例如IdAnswer IdUser IdQuestion Answer
1 John 1 0
2 John 4 1
3 John 5 1
4 John 6 0
5 Bob 1 1
6 Bob 3 1
7 Bob 5 0
8 Mark 2 0
9 Mark 7 1
10 Mark 5 0
= 5),以及每个用户在问题编号5之前回答的最后一个问题。
最后我需要一个看起来像这样的表:
IdQuestion
我已经设法使用游标来迭代第一个IdAnswer IdUser IdQuestion Answer
2 John 4 1
3 John 5 1
6 Bob 3 1
7 Bob 5 0
9 Mark 7 1
10 Mark 5 0
结果中的每一行(按SELECT
过滤),但是我不确定这是否是最好的(并且最快)的方式。有没有更有效的方法来实现相同的结果?
顺便说一下,我正在使用SQL Server Management Studio 2012。
答案 0 :(得分:0)
以下是使用LEAD
函数
select * from
(
select *,NextQ = Lead(IdQuestion)over(partition by IdUser order by IdAnswer)
from youtable
) a
Where 5 in (IdQuestion, NextQ )
旧版本
;WITH cte
AS (SELECT prev_id = Min(CASE WHEN IdQuestion = 5 THEN rn - 1 END) OVER( partition BY IdUser),*
FROM (SELECT rn = Row_number()OVER(partition BY IdUser ORDER BY IdAnswer),*
FROM Yourtable)a)
SELECT *
FROM cte
WHERE rn IN ( prev_id, prev_id + 1 )