首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL替代T-SQL的TIES

问MySQL替代T-SQL的TIES
EN

Stack Overflow用户
提问于 2010-08-12 23:02:59
回答 3查看 7.7K关注 0票数 4

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

代码语言:javascript
复制
+-------+--------+
| Name  | Value  |
+-------+--------+
| A     | 10     |
| B     | 30     |
| C     | 40     |
| D     | 40     |
| E     | 20     |
| F     | 50     |
+-------+--------+

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

代码语言:javascript
复制
SELECT * FROM table ORDER BY Value DESC LIMIT 3

我明白了:

代码语言:javascript
复制
+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
+-------+--------+

我想要的是这个

代码语言:javascript
复制
+-------+--------+
| Name  | Value  |
+-------+--------+
| F     | 50     |
| C     | 40     |
| D     | 40     |
| B     | 30     |
+-------+--------+

我计算每条记录的排名,所以我真正想要的是获得排名前N的记录,而不是按值排序的前N条记录。这是我计算排名的方法:

代码语言:javascript
复制
SELECT Value AS Val, (SELECT COUNT(DISTINCT(Value))+1 FROM table WHERE Value > Val) as Rank

在T-SQL中,这样做是可以实现的:

代码语言:javascript
复制
SELECT TOP 3 FROM table ORDER BY Value WITH TIES

有谁知道如何在MySQL中做到这一点吗?我知道这可以用子查询或临时表来完成,但我没有足够的知识来实现这一点。我更喜欢不使用临时表的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-12 23:06:45

这对你有效吗?

代码语言:javascript
复制
select Name, Value from table where Value in (
    select distinct Value from table order by Value desc limit 3
) order by Value desc

或者:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2013-06-14 03:14:26

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2018-09-19 04:03:55

从MySQL 8开始,您可以使用窗口函数通过过滤WITH TIES来模拟RANK()语义。例如:

代码语言:javascript
复制
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子句可以实现的功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3469107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档