sqlserver 怎样取出最后几条数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 怎样取出最后几条数据相关的知识,希望对你有一定的参考价值。

不要用其中的字段排序

不用排序,但是表需要有一个唯一确定一条记录的ID字段,设表名为TABLENAME,ID为其唯一关键字段,这样实现:

declare @BOTT INT,@COUNT int,@SQLSTR VARCHAR(1000)
SET @BOTT=10--设置要取得最后几条记录,这里是10条
SET @COUNT=(SELECT COUNT(1) FROM TABLENAME)--求出表的总记录数
IF @COUNT>@BOTT--如果总记录数大于要求结果的记录数,就减去要求记录数
SET @COUNT=@COUNT-@BOTT
SET @SQLSTR='SELECT * FROM TABLENAME WHERE ID NOT IN(SELECT TOP '+CONVERT(VARCHAR,@COUNT)+' ID FROM TABLENAME)'
--注:子查询记录数TOP 是总记录数-要求记录数,所以主查询就是总记录除去子查询记录数
exec(@SQLSTR)

追问

用唯一字段我知道怎么做,我现在就是想写一个通用的sql,只需要传入表名就行了,能帮忙想想吗

追答

我写的查询意思你应该明白了,就是首先用TOP求出不要的记录,再根据求出的ID从结果集中排除,如果不知道ID,那么怎样排除,你可以自已想办法,只不过这是我认为的最佳方案。
我们实现一个功能,要符合逻辑才能实现,要对记录进行辨别是否符合条件,就要给出确定该行的主键,不知道主键,也不知道以什么排序,怎么去求结果呢?
如果是VFP就好了,每个记录都有一个记录号,只接RECNO()等于多少就行了。

当然可以通过游标生成一个新表,在新表中加入记录号,但是这样效率就太低了。而且新表的顺序并不一定与原表的顺序一致,所以结果也不一定正确。

参考技术A CREATE TABLE #temp (
  ID  INT
)
GO
 
INSERT INTO #temp VALUES(5);
INSERT INTO #temp VALUES(1);
INSERT INTO #temp VALUES(7);
INSERT INTO #temp VALUES(8);
GO
 
SELECT * FROM #temp;
go
 
ID
-----------
          5
          1
          7
          8
 
(4 行受影响)
 
 
SELECT 
  ID
FROM
(
SELECT
  ROW_NUMBER() OVER( ORDER BY (SELECT 1) ) NO,  ID
FROM
  #temp
) subQuery
ORDER BY
  NO DESC;
GO
 
 
ID
-----------
          8
          7
          1
          5
 
(4 行受影响)



你要最后几条数据,  就在最后那个 sql  那里,  简单加   TOP  N  来处理了。

追问

我的意思是不使用其中的任何字段来实现,

追答

那个测试表, 只有一列, 名字是 ID

对于这一列, 只有一句 SELECT ID , 显示出来。
没有任何的 排序操作。 你还想怎么样?

难道 SELECT 也不允许么?

追问

我是想写一个通用的sql语句,别人只需要传入一个表名进来就行了,并不知道别人的列名,我知道oracle和mysql可以实现,但是sqlserver不知道怎么实现

追答1> SELECT
2>   TOP 3 *
3> FROM
4>   #temp
5> ORDER BY
6>   ROW_NUMBER()OVER(ORDER BY (SELECT 1))  DESC;
7> GO
ID
-----------
          8
          7
          1

(3 行受影响)



看仔细了哦.

只有  

SELECT  TOP 3  *  FROM  表

后面的  ORDER  BY  里面, 没有任何列

这个你应该满足了吧?

追问

非常感谢 你,亲,但是这个怎么分页啊!你这个是查的前三条,那我现在是第二页,要查4到6条数据怎么传条件

本回答被提问者采纳

Redis简单案例 网站最近的访问用户

  我们有时会在网站中看到最后的访问用户、最近的活跃用户等等诸如此类的一些信息。本文就以最后的访问用户为例,

用Redis来实现这个小功能。在这之前,我们可以先简单了解一下在oracle、sqlserver等关系型数据库中是怎么实现的。

不可否认至少会有一张表来记录,根据时间desc排序,再取出前几条数据。下面来看看怎么用Redis来实现这个小功能:

  
  案例用到的一些相关技术和说明:
 
技术 说明
Redis 存储数据,用了主从的模式,主写从读
artTemplate 主要是用于显示最后登陆的5位用户的名称

  简单的思考:要用Redis的那种数据结构来存储这些数据呢?我们只要显示最后的5个访问用户(游客不在统计之内),结合

一些数据的操作,个人认为,List是个比较好的选择。 

  要记录下是那个用户的访问,必须要有一个登陆的操作控制。

 1         /// <summary>
 2         /// simulating user login
 3         /// </summary>
 4         /// <param name="name"></param>
 5         /// <returns></returns>
 6         [HttpPost("/login")]
 7         public IActionResult Login(string name)
 8         {
 9             if (!string.IsNullOrWhiteSpace(name))
10             {
11                 //Distinct
12                 var tran = _redis.GetTransaction();
13                 tran.ListRemoveAsync(_key, name, 1);
14                 tran.ListLeftPushAsync(_key, name);
15                 tran.Execute();
16                                
17                 var json = new { code="000",msg= string.Format("{0} login successfully",name) };
18                 return Json(json);
19             }
20             else
21             {
22                 var json = new { code = "001", msg = "name can‘t be empty" };
23                 return Json(json);
24             }                      
25         }

  在处理登陆时,难免会出现这样的情况,在一段时间内只有1个用户登陆,而且这个用户还由于一些原因登陆了多次,所以

我们需要简单的处理一下,让我们的List只记录下最新的那个记录就好,所以要先把已经存在的先remove掉,然后才把新的记录

push进去。

  接下来就是处理要显示的信息了。我们需要先知道我们的key中已经有多少个元素(用户)了,然后根据这个数量来进行不同的

处理:当不足5个的时候,就不用进行ltrim操作,直接取全部数据就好了,超过5个时,就先用ltrim处理一下,再取List中的数据。

 1         /// <summary>
 2         /// get the last 5 login user
 3         /// </summary>
 4         /// <returns></returns>
 5         [HttpGet("/login/last")]
 6         public IActionResult GetLastFiveLoginUser()
 7         {
 8             var len = _redis.LLen(_key);            
 9             if (len > _loginUserAmount)
10             {
11                 //limit the count
12                 _redis.LTrim(_key, 0, _loginUserAmount-1);
13             }
14             var list = (from i in _redis.LRange(_key, 0, -1) select i.ToString()); 
15                        
16             var json = new { code="000",msg="ok",data = list };
17             return Json(json);
18         }
  到这里,我们的后台逻辑已经实现了,下面就是前台的展示了。

  要模拟多个用户登陆,所以就用了几个按钮来模拟,触发点击事件就是登陆成功。登陆成功之后自然在更新最近的访问用户信

息,所以要在登陆成功的回调函数中去刷新一下访问用户的信息。登陆的function如下:

 1      function login(name) {
 2             $.ajax({
 3                 url: "/login",
 4                 data: { "name": name },
 5                 dataType: "json",
 6                 method: "POST",
 7                 success: function (res) {                  
 8                     if (res.code == "000") {                     
 9                         getLastFiveLoginUser();
10                     } else {
11                         console.log(res.msg);
12                     }
13                 }
14             });
15         }

  下面就是登陆成功的回调函数,取到数据后便向模板中灌数据,然后把根据模板得到的html放到id为lastLoginUser的div中。

具体代码如下:

 1       function getLastFiveLoginUser() {
 2             $.ajax({
 3                 url: "/login/last",
 4                 data: {},
 5                 dataType: "json",
 6                 success: function (res) {                  
 7                     if (res.code == "000") {                       
 8                         var html = template(‘lastLoginUserTpl‘, res);                       
 9                         $("#lastLoginUser").html(html);                        
10                     }
11                 }
12             });
13         }

  上面说到的模板,定义是十分简单的,更多有关于这个模板引擎的信息可以参考这个地址:https://github.com/aui/artTemplate

下面是模板的具体代码:
1 <script id="lastLoginUserTpl" type="text/html">
2         <ul>
3             {{each data as item}}
4             <li>
5                 {{item}}
6             </li>
7             {{/each}}
8         </ul>
9 </script>

 

好了,到这里是前后台都处理好了,下面来看看效果:
技术分享

  可以看到,正如我们的预期,只显示最后登陆的5个用户的名称。

  再来看看redis里面的数据:

  技术分享

  正好应验了前面说的只保留了最后的5个。

  记录最新的一些日记信息、交易信息等等都是属于一个大类的,其实对于这一类问题,都是可以用List来处理的,可以来看看

官网的这段话,这段话包含了许多的应用场景。 

  This pair of commands will push a new element on the list, while making sure that the list will not grow larger

than 100 elements. This is very useful when using Redis to store logs for example. It is important to note that

when used in this way LTRIM is an O(1) operation because in the average case just one element is removed from

the tail of the list.

  
 

以上是关于sqlserver 怎样取出最后几条数据的主要内容,如果未能解决你的问题,请参考以下文章

怎样将sqlserver2005数据库中一张表的一半数据取出来

sql取出每个分组的前几条

Redis简单案例 网站最近的访问用户

oracle开展分组后,取出每组的前几条数据

mysql随机查询符合条件的几条记录

mysql分组排序后取出几条记录,