一尘不染

MySQL替代T-SQL的WITH TIES

mysql

我有一张要从中获取前N条记录的表。记录按值排序,某些记录具有相同的值。我想在这里做的是获取前N条记录的列表,包括并列记录。这是表中的内容:

+-------+--------+
| Name  | Value  |
+-------+--------+
| A     | 10     |
| B     | 30     |
| C     | 40     |
| D     | 40     |
| E     | 20     |
| F     | 50     |
+-------+--------+

现在,如果我想获得像这样的前三名

SELECT * FROM table ORDER BY Value DESC LIMIT 3

我得到这个:

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
+-------+--------+

我想得到的是这个

+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
| B     | 30     |
+-------+--------+

我计算每条记录的排名,因此我真正想要的是获得前N个排名记录,而不是按值排序的前N个记录。这是我如何计算排名:

SELECT Value AS Val, (SELECT COUNT(DISTINCT(Value))+1 FROM table WHERE Value > Val) as Rank

在T-SQL中,通过执行以下操作可以实现以下目的:

SELECT TOP 3 FROM table ORDER BY Value WITH TIES

有谁知道如何在MySQL中执行此操作?我知道可以使用子查询或临时表来完成此操作,但我没有足够的知识来完成此操作。我希望不使用临时表的解决方案。


阅读 431

收藏
2020-05-17

共1个答案

一尘不染

这对您有用吗?

select Name, Value from table where Value in (
    select distinct Value from table order by Value desc limit 3
) order by Value desc

也许:

select a.Name, a.Value 
from table a
join (select distinct Value from table order by Value desc limit 3) b
     on a.Value = b.Value
2020-05-17