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



我是SQL新手,所以我需要你的帮助查询。 基本上我有一个邮政编码数据库,我想在选定的邮政编码之前获取 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')

从某处拿起了一个示例查询,并成功将其转换为供我使用。 唯一的问题是此查询返回当前项和下一项。 相反,它应该返回前 3 项、当前项和接下来的 3 项。

使用生成编号序列的公用表表达式(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 引擎认为合适的任何顺序返回。要进行这样的查询,必须应用订单并生成索引号。这是在编号邮政编码中完成的。第二部分只是一个查询,用于从中获取数据。

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

"

之前"和"之后"仅在排序上下文中有意义。假设您希望按邮政编码订购,选择所需的邮政编码和 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小提琴中玩它。

所选邮政编码前的 3 个项目和 3 个项目后

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

现在,让我们不要进入更复杂的东西 - FURST 您必须创建一个要求中心项目的订单,然后在第二个查询中您可以请求其他 6 个。对不起,没有其他办法。x+3 可以使用 Top 4 语句和过滤器等 - 但之前的 3 肯定需要第二次查询。

所有假设您创建的查询/视图具有*按定义的顺序排列邮政编码* 过滤后的行号,用于定义 (a) "当前行"以及过滤所有具有较小行的行。

但是您首先需要手动下订单。

最新更新