SQL选择基于先前选择的每一行

时间:2018-01-21 14:13:42

标签: select sql-server-2012

我有一张表格,里面有不同问题的答案,所有问题都有编号。基本上有以下列:class Foo { get bar() { return this._bar }; set bar(val) { this._bar = val }; } Foo.prototype._bar = 0; (表中每个答案都是唯一的),IdAnswer(即使同一用户第二次回答问题也不会重复),IdUserIdQuestion

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。

1 个答案:

答案 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 )