选择符合条件的最后n行

时间:2019-07-12 13:46:53

标签: sql sql-server

我是SQL的新手,我正试图编写一个查询来过滤值并检索符合该条件的最后n条记录。

我的数据具有MainAssemblyIdnty,条形码,单元名称。对于“单元名”字段,有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条记录。

3 个答案:

答案 0 :(得分:1)

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

如果您使用import React from 'react'; import connect from "react-redux/es/connect/connect"; import {getUser} from "../actions/userAction"; class Example extends React.Component { componentDidMount() { this.props.getUser(); } render() { if (!Object.keys(this.props.user.data).length) return <div>Loading user's data</div>; return ( <div> { JSON.stringify(this.props.user.data) } </div> ); } } const mapStateToProps = (state) => { return { user: state.user }; }; export default connect(mapStateToProps, { getUser, })(Example); 来确定哪些行是“最后”,那么您只需要这样做:

MainAssemblyIdnty

根据评论进行编辑:我很确定您误解了所看到的结果。您看到不到100行返回,并且您认为这意味着查询首先获取前100行,然后将这些行过滤为仅包含SELECT TOP 100 (Barcode) FROM Results WHERE Cellname= 'Cell 3' ORDER BY MainAssemblyIdnty DESC 的行。

但事实并非如此。 SQL不能那样工作。首先应用该过滤器,然后结果受前100名限制。如果您获得的行数少于100,则表明整个表中少于100行与该过滤器匹配。

如果您怀疑它,仅是因为“表中有成千上万条记录”,请使用以下简单查询对其进行测试:

Cellname = 'Cell 3'

答案 1 :(得分:1)

您应该有一个ORDER BY子句:

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

为了提高性能,您希望在Results(Cellname, MainAssemblyIdnty DESC)上建立索引。

如果只有30行,则只会得到30条结果。目前尚不清楚您在这种情况下的真正意图。

答案 2 :(得分: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中为我们提供表的架构。

谢谢, 约翰。