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 |
+----+-----------+--------------+------------+--------+------------+
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 不同吗?的主要内容,如果未能解决你的问题,请参考以下文章
C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。
C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。