【问题标题】:SQL Select based on each row of previous selectSQL Select 基于先前选择的每一行
【发布时间】:2018-01-21 14:13:41
【问题描述】:

我有一张表格,上面有不同问题的答案,所有问题都有编号。基本上有这些列:IdAnswer(对于表格中的每个答案都是唯一的)、IdUser(即使同一用户第二次回答问题也不会重复)、IdQuestionAnswer

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

我想从该表中选择特定问题的所有答案(例如,IdQuestion = 5),以及每个用户在第 5 个问题之前回答的最后一个问题。

最后我需要一个应该是这样的表格:

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 结果(按 IdQuestion 过滤)中遍历每一行,但我不确定这是否是最好的(也是最快的)这样做的方式。有没有更有效的方法可以达到同样的效果?

顺便说一句,我使用的是 SQL Server Management Studio 2012。

【问题讨论】:

  • 什么 SQL 版本?将特定于版本的标签添加到您的问题中,因为解决方案可能会有所不同。
  • 好的,刚做了,谢谢提示。

标签: select sql-server-2012


【解决方案1】:

这是使用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 ) 

【讨论】:

  • 我试过了,这实际上比游标方法花费的时间要长一些,但另一方面它更容易使用。我来看看这些 LEAD 和 PARTITION 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
相关资源
最近更新 更多