Sql server 如何按范围选择行?

Sql server 如何按范围选择行?,sql-server,sql-server-2008,pivot,Sql Server,Sql Server 2008,Pivot,我有一个名为“T”的下表 我期望的输出应如下所示: 我想选择列“Actual”应该在列“Basic”之间具有范围的行,但是如果您以“Model”=HT65为例 '实际'=23.2,其范围在'Basic'列的22和24之间,所以我应该得到如下行,其中'Level'列为2 同样,应选择其他行。 非常感谢您的帮助。您可以使用以下解决方案,使用多个左连接来连接当前行的下一行和最后一行。通过一些附加条件,您可以检查范围: SELECT t1.Model, t1.Level, t1.Basic, t1.Ac

我有一个名为“T”的下表

我期望的输出应如下所示:

我想选择列“Actual”应该在列“Basic”之间具有范围的行,但是如果您以“Model”=HT65为例 '实际'=23.2,其范围在'Basic'列的22和24之间,所以我应该得到如下行,其中'Level'列为2

同样,应选择其他行。
非常感谢您的帮助。

您可以使用以下解决方案,使用多个左连接来连接当前行的下一行和最后一行。通过一些附加条件,您可以检查范围:

SELECT t1.Model, t1.Level, t1.Basic, t1.Actual
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Model ORDER BY Basic) AS rn 
  FROM test
) t1 LEFT JOIN (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Model ORDER BY Basic) AS rn 
  FROM test
) t2 ON t1.Model = t2.Model AND t1.rn + 1 = t2.rn LEFT JOIN (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Model ORDER BY Basic) AS rn 
  FROM test
) t3 ON t1.Model = t3.Model AND t1.rn - 1 = t3.rn
WHERE (t1.Actual BETWEEN t3.Basic AND t1.Basic)
  OR (t3.Model IS NULL AND t1.Actual < t1.Basic)
  OR (t2.Model IS NULL AND t1.Actual > t1.Basic)
ORDER BY t1.Model ASC

到目前为止你累了什么?我不知道你的问题是关于什么的。你可能想更好地解释一下逻辑。
SELECT t.Model, t.Level, t.Basic, t.Actual
FROM (
  SELECT *, LAG(Basic, 1,0) OVER (PARTITION BY Model ORDER BY Basic) AS prevBasic,
    LEAD(Basic, 1, 0) OVER (PARTITION BY Model ORDER BY Basic) AS nextBasic
  FROM test 
) t 
WHERE (t.Actual BETWEEN t.prevBasic AND t.Basic)
   OR (t.nextBasic = 0 AND t.Actual > t.Basic)
ORDER BY t.Model ASC