Функция TOP не работает так же, как LIMIT в mysql? - PullRequest
0 голосов
/ 10 апреля 2020

Данные

+----+-----------+--------------+------------+--------+------------+
| 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

MS SQL

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

Для большинства сценариев ios я использовал top 1 и limit 1 для похожих результатов до этого вопроса. Как-то в этом запросе я получаю разные результаты. Куда я иду не так? Отличается ли порядок выполнения в MS SQL для предложения TOP? Или я полностью путаю сценарий использования этих двух?

Оригинальный вопрос от Leetcode

1 Ответ

2 голосов
/ 10 апреля 2020

На SQL сервере деление двух целых чисел является целым числом. Итак, 1/2 = 0, а не 0,5.

Чтобы исправить это, используйте:

order by num * 1.0 / den

Кроме того, если для клавиши order by есть повторяющиеся значения, тогда произойдет произвольное будет возвращена эквивалентная строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...