我有一个表,我想从中获取前N条记录。这些记录是按值排序的,并且某些记录具有相同的值。我想在这里做的是获得前N个记录的列表,包括被绑定的记录。这是表格中的内容:
+-------+--------+
| Name | Value |
+-------+--------+
| A | 10 |
| B | 30 |
| C | 40 |
| D | 40 |
| E | 20 |
| F | 50 |
+-------+--------+现在,如果我想像这样获得前3名
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中做到这一点吗?我知道这可以用子查询或临时表来完成,但我没有足够的知识来实现这一点。我更喜欢不使用临时表的解决方案。
发布于 2010-08-12 23:06:45
这对你有效吗?
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发布于 2013-06-14 03:14:26
select a.Name, a.Value
from table a
join (select Value from table order by Value desc limit 3) b
on a.Value = b.Value这类似于@Fosco的答案,但子查询中没有DISTINCT。他的版本返回具有前N个分数的球员,而不是前N个球员(加平局)。例如,如果得分是50,50,50,40,40,30,20,他会返回6个玩家( 3x50,2x40,1x30),但你可能只想要3x50。
发布于 2018-09-19 04:03:55
从MySQL 8开始,您可以使用窗口函数通过过滤WITH TIES来模拟RANK()语义。例如:
SELECT Name, Value
FROM (
SELECT Name, Value, RANK() OVER (ORDER BY Value DESC) AS rk
FROM table
) t
WHERE rk <= 3请注意,当更仔细地阅读您的问题时,这并不完全符合您的要求,但它确实实现了T-SQL通过TOP n WITH TIES子句可以实现的功能。
https://stackoverflow.com/questions/3469107
复制相似问题