【问题标题】:Does TOP function not work the same way as LIMIT in mysql?TOP 函数的工作方式与 mysql 中的 LIMIT 不同吗?
【发布时间】: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的原始问题

【问题讨论】:

    标签: mysql sql sql-server


    【解决方案1】:

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

    要解决此问题,请使用:

    order by num * 1.0 / den
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多