我是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条记录。
答案 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中为我们提供表的架构。
谢谢, 约翰。