1

我是 SQL 新手,我正在尝试编写一个查询来过滤值并检索与该条件匹配的最后 n 条记录。

我有具有 MainAssemblyIdnty、Barcode、Cellname 的数据。对于 Cellname 字段,有 3 个单元格;单元格 1、单元格 2 和单元格 3。我正在尝试仅检索单元格 3 的最后 n 条记录。我尝试使用 TOP 和 MAX 函数,但显示的结果仅显示 30 个结果。我还查看了 LIMIT 函数,但我的 SQL 版本似乎不支持它。查看以下代码:

SELECT TOP 100 (Barcode) FROM Results WHERE Cellname= 'Cell 3'

SELECT  (Barcode)
FROM Results
WHERE IIf(Cellname='Cell 3',MainAssemblyIdnty,null) > 
    (
    Select Max(MainAssemblyIdnty) - 100 
    From Results 
    WHERE Cellname='Cell 3'
    )

它似乎需要最后 100 条记录(无论哪个单元名称),然后按单元名称过滤,但我希望它按单元名称过滤,然后只给出 100 条该单元名称的记录。

4

3 回答 3

1

TOP 是执行此操作的正确方法,您的尝试可能无效的唯一原因是您没有提供 ORDER BY。这意味着,获得任何 100 行......而不是获得最后 100 行。

如果您使用MainAssemblyIdnty来确定哪些行是“最后一个”,那么您只需要这样做:

SELECT TOP 100 (Barcode) 
FROM Results 
WHERE Cellname= 'Cell 3' 
ORDER BY MainAssemblyIdnty DESC

根据评论进行编辑:我很确定您误解了您所看到的结果。您看到返回的行少于 100 行,并且您认为这意味着查询首先获取前 100 行,然后将这些行过滤为仅具有Cellname = 'Cell 3'.

然而,事实并非如此。SQL 不能那样工作。首先应用过滤器,然后结果受 TOP 100 的限制。如果您获得的行数少于 100 行,则意味着 ENTIRE TABLE 中与过滤器匹配的行数少于 100。

如果你怀疑它,仅仅因为“表中有数千条记录”,用这个简单的查询来测试它:

SELECT COUNT(*) 
FROM Results 
WHERE Cellname= 'Cell 3'
于 2019-07-12T14:16:28.340 回答
1

你应该有一个ORDER BY子句:

SELECT TOP 100 (Barcode)
FROM Results
WHERE Cellname = 'Cell 3'
ORDER BY MainAssemblyIdnty DESC ; 

出于性能考虑,您需要在Results(Cellname, MainAssemblyIdnty DESC).

如果你只有 30 行,那么你只会得到 30 个结果。在这种情况下,您的真正意图尚不清楚。

于 2019-07-12T14:17:38.143 回答
0

您在几个回复中提到您正在寻找 100 个“最新”行,其中 cellname = 'Cell 3'

首先,您有任何类型的时间戳吗?如果是这样,则使用 TOP 并按时间戳 DESC 排序。为了获得更好的性能,建议您在该列和 cellname 列上创建一个非聚集索引,如下所示:

CREATE NONCLUSTERED INDEX 
    IX_RESULTS_CELLNAME_TIMESTAMP
ON [RESULTS]
(
    [CELLNAME]
    ,[TIMESTAMP]
)

;

如果您没有时间戳,那么 MainAssemblyIdnty 列是序号吗?

如果是这样,那么您可以完全按照 Gordon 上面的建议进行操作。为了提高性能,您应该考虑创建上面的非聚集索引,但将 MainAssemblyIdnty 作为第二个索引列。

现在请注意,其他通知您将按指定顺序获得前 100 行的其他人,如果存在少于 100 行,您将获得这些,是完全正确的。

希望这可以帮助。下次,请考虑在您的 SELECT 中向我们提供表的架构。

谢谢,约翰。

于 2019-07-12T15:30:52.893 回答