选择前3个意外结果?

时间:2014-02-25 10:03:05

标签: sql-server tsql

这是表结构!

  

name varchar(10),

     

得分浮动

使用值:

('Alex',7),('john',5.6),('Tom',8.9),('Anonio',6),('sharti',7),('mamuzi',9)

我需要o / p

name    score
mamuzi  9
Tom 8.9
Alex    7
sharti  7

当我尝试使用TOP时:select top 3 * from table order by score desc我无法获得预期效果

3 个答案:

答案 0 :(得分:2)

除非您包含ORDER BY语句,否则当您使用TOP时,排序将是随机的。

这样做:

SELECT TOP 3 WITH TIES * FROM YourTable ORDER BY score DESC

示例SQL Fiddle

来自documentation

  

当TOP与ORDER BY子句一起使用时,结果   set仅限于前N个有序行数;否则,它   以未定义的顺序返回前N行。

编辑:只是注意到了示例数据的变化。为了使其工作,您需要将WITH TIES子句添加到TOP,如其他答案中所指出的那样。我已相应更新了我的答案。

答案 1 :(得分:2)

尝试在sql server中使用with Ties,因为Alex and sharti具有相同的分数

select top 3 with ties * from #t order by score desc

See here

答案 2 :(得分:0)

您忘记了 score字段的订购。将您的查询修改为:

SELECT TOP 3 * FROM table ORDER BY score DESC

回答您问题的最后修改:使用TOPORDER BY DESC为我工作但我使用您添加到问题中的新值进行了测试。我的测试如下:

DECLARE @table TABLE
(
  name varchar(10),
  score float
) 

INSERT INTO @table VALUES ('Alex', 7)
INSERT INTO @table VALUES ('john',5.6)
INSERT INTO @table VALUES ('Tom',8.9)
INSERT INTO @table VALUES ('Anonio',6)
INSERT INTO @table VALUES ('sharti',7)
INSERT INTO @table VALUES ('mamuzi',9)

SELECT TOP 3 * FROM @table ORDER BY score DESC

它起作用,因为结果是预期的。

要将sharti及其得分包含在结果中,因为他的得分与Alex相同,您需要WITH TIES建议使用Vijaykumar Hadalgi({{3对于WITH TIES)。

将您的查询修改为:SELECT TOP(3) WITH TIES * FROM @table ORDER BY score DESC

name    score
--------------
mamuzi  9
Tom     8,9
Alex    7
sharti  7