除非注明,文章均为 战战如疯 原创,转载请保留链接: http://www./cat4/509.html,VBA交流群273624828。 在之前关于SQL的知识中我们讲过要提前记录的前n条的话可以用Top命令,如果要对提取出来的数据进行排序可以用Order by,那么如果我们要从一批数据里面提取出前n大的数据自然就想到了先用Order by对数据进行排序,然后再从排好的数据中取出前n条就可以了。那下面我们来看个例子,有如下一个表 现在我们要从中取出前3名,显然这里有4个99,那我们只要取任意3个99就可以了,看我下面写的代码
上面的代码看上去没有什么问题,运行一下结果如下 结果是4个,不是我们所预料的3个,显然我们的SQL语句与我们理解的有差别。之所以会出现这样的问题是因为我们将Top与Order结合用了,当两者结合用的时候Top n就不是指前n条了,而成了前n名了。那这个名次怎么排的呢?很简单,原表中4个99分的排名都是1,5个1分的排名都是5,没有2、3、4名,最低分0的排名是10,没有6、7、8、9名。所以如果你取top1、top2、top3或者top4得到的都是4个排名1的数据,如果你取top5、top6、top7、top8或top9那得到的就是排名1和排名5的一共9个数据。例如top9取前9名那就是第1名4个,2、3、4名0个,第5名5个,6、7、8、9名0个,加起来是9个了。 那如果我就是想取前n个数据而不是前n名,那怎么办?很简单,看下面的代码
上面的代码运行一下得到的结果就是3个数据,这个sql语句包括了两部分,先用"select 姓名,数学 from [Sheet1$A1:B11] order by 数学 desc"形成一个降序排列的查询,然后我们再从这个查询中取top 3,所以这里top语句的结构就成了“select top * from [table]”,也就没有了order by的问题了,所以最后我结果就是实实在在的前3行数据。 本节示例文件下载:http://pan.baidu.com/s/1pJsieYf。
|
|