获取项目之前和之后的项目 - SQL查询

时间:2012-05-06 07:04:16

标签: sql

我是SQL的新手,所以我需要你的查询帮助。基本上我有一个ZipCodes数据库,我希望在选定的ZipCode和之后的3个项目之前获得3个项目。我提出的查询非常糟糕......

WITH numberedlogtable AS
(
SELECT *
 FROM dbo.US
)

SELECT *
FROM numberedlogtable
WHERE ZipCode IN (SELECT ZipCode+i
             FROM numberedlogtable
             CROSS JOIN (SELECT -1 AS i UNION ALL SELECT 0 UNION ALL SELECT 1) n
             WHERE ZipCode='91803')

我从某处获取了一个示例查询,并成功转换它供我使用。唯一的问题是此Query返回当前项和下一项。相反,它应该返回前3项,当前项和后三项。

3 个答案:

答案 0 :(得分:5)

使用公共表表达式(WITH部分)生成编号序列:

WITH NumberedZipCodes AS
(SELECT SELECT ROW_NUMBER() OVER (ORDER BY ZipCode) AS RowNumber, *
FROM ZipCodes)

SELECT * From NumberedZipCodes
WHERE RowNumber BETWEEN
(SELECT RowNumber FROM NumberedZipCodes WHERE ZipCode=91803) - 3
AND (SELECT RowNumber FROM NumberedPerson WHERE ZipCode=91803) + 3

通常在SQL中,没有匹配中的上一个或下一个项目的概念。实际上,除非指定了order by子句,否则将按照sql引擎找到的任何顺序返回行。要进行这样的查询,必须应用订单并生成索引编号。这是在NumberedZipCodes中完成的。第二部分只是一个从中获取数据的查询。

要使查询高效运行,请确保ZipCode列上有索引。

答案 1 :(得分:4)

“之前”和“之后”仅在订购的背景下具有意义。假设您希望按邮政编码订购,选择所需的邮政编码,然后选择2行,如下所示:

SELECT TOP(3) *
FROM numberedlogtable
WHERE ZipCode >= '91803'
ORDER BY ZipCode

之前选择3行:

SELECT TOP(3) *
FROM numberedlogtable
WHERE ZipCode < '91803'
ORDER BY ZipCode DESC

将UNION ALL置于这两个查询之间,使其成为一个,如果这是你想要的。

您可以在SQL Fiddle

中使用它

答案 2 :(得分:0)

  

所选ZipCode之前的3个项目和之后的3个项目

SQL是基于设置的,它没有已定义的顺序,除非您定义一个(按顺序)。

现在,让我们不要进入更复杂的东西 - FURST你必须创建一个要求中心项目的订单,然后在第二个查询中你可以要求另一个6.对不起,别的方式。使用前4个语句和过滤器等可以使用x + 3 - 但之前的3个肯定需要第二个查询。

所有假设你有creata查询/视图 *按定义的顺序zipCodes *过滤后的行号,用于定义(a)“当前行”以及过滤所有较小行的行。

但您首先需要手动订购。