TOP 函数的工作方式与 mysql 中的 LIMIT 不同吗?

Posted

技术标签:

【中文标题】TOP 函数的工作方式与 mysql 中的 LIMIT 不同吗?【英文标题】:Does TOP function not work the same way as LIMIT in mysql? 【发布时间】:2020-04-10 19:53:58 【问题描述】:

数据

+----+-----------+--------------+------------+--------+------------+
| id |   action  |  question_id |  answer_id |  q_num |  timestamp |
+----+-----------+--------------+------------+--------+------------+
|  5 |  "show"   |          285 |  null      |      1 |        123 |
|  5 |  "answer" |          285 |  124124    |      1 |        124 |
|  5 |  "show"   |          369 |  null      |      2 |        125 |
|  5 |  "skip"   |          369 |  null      |      2 |        126 |
+----+-----------+--------------+------------+--------+------------+

mysql

select question_id as survey_log
from
(
    SELECT sum(CASE WHEN action='answer' THEN 1 ELSE 0 END) as num,
    question_id,
    count(distinct id) as den
    from
    survey_log
    group by question_id
) b
order by (num/den) desc
limit 1

输出

285

MSSQL

select top 1 question_id as survey_log
from
(
    SELECT sum(CASE WHEN action='answer' THEN 1 ELSE 0 END) as num,
    question_id,
    count(distinct id) as den
    from
    survey_log
    group by question_id
) b
order by (num/den) desc

输出

369

对于大多数情况,我使用 top 1 和 limit 1 来获得类似的结果,直到这个问题。不知何故,在这个查询中,我得到了不同的结果。我哪里错了? TOP 子句在 MSSQL 中的执行顺序是否不同?还是我完全混淆了两者的用例?

来自Leetcode的原始问题

【问题讨论】:

【参考方案1】:

在 SQL Server 中,两个整数相除是一个整数。所以,1/2 = 0,而不是 0.5。

要解决此问题,请使用:

order by num * 1.0 / den

此外,如果order by 键存在重复值,则将返回任意等效行。

【讨论】:

以上是关于TOP 函数的工作方式与 mysql 中的 LIMIT 不同吗?的主要内容,如果未能解决你的问题,请参考以下文章

lim在函数plt.axis(lim)中起什么作用?

MySQL获取分组后的TOP 1和TOP N记录

mysql分组top1 和 topn

初等函数求导

C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。

C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。