Решение SQL не принято в LeetCode - PullRequest
0 голосов
/ 07 января 2019

Я написал следующее решение проблемы LeetCode:

SELECT ROUND(1.0*sum(t1.accepted_requests)/sum(t2.total_requests), 2) AS accept_rate
FROM (SELECT 'cool' AS common, ra.accepter_id, COUNT(DISTINCT ra.requester_id) AS accepted_requests
FROM request_accepted ra 
GROUP BY 1, 2) AS t1
JOIN
(SELECT 'cool' AS common, fr.send_to_id, COUNT(DISTINCT fr.sender_id) AS total_requests
FROM friend_request fr
GROUP BY 1, 2) AS t2
ON t1.common = t2.common

Я выполнил запрос, и результат был идентичен ожидаемому ответу, опубликованному LeetCode. Однако алгоритм LeetCode говорит, что мой запрос неверен, и я не могу понять, почему.

Проблема LeetCode описана ниже:

В таких социальных сетях, как Facebook или Twitter, люди отправляют запросы на добавление в друзья и принимают запросы других. Теперь приведены две таблицы, как показано ниже:

enter image description here

Напишите запрос, чтобы найти общую скорость принятия запросов, округленную до 2 десятичных знаков, то есть на количество принятых делений, деленных на количество запросов.

enter image description here

Note:

Принятые запросы не обязательно из таблицы friend_request. В этом случае вам просто нужно просто посчитать общее количество принятых запросов (независимо от того, присутствуют ли они в исходных запросах) и разделить его на количество запросов, чтобы получить коэффициент принятия.

Возможно, что отправитель отправляет несколько запросов одному и тому же получателю, и запрос может быть принят более одного раза. В этом случае «дублированные» запросы или акцепты учитываются только один раз.

Если запросов нет вообще, вы должны вернуть 0.00 в качестве accept_rate.

Объяснение: Есть 4 уникальных принятых запроса и всего 5 запросов. Таким образом, ставка составляет 0,80.

1 Ответ

0 голосов
/ 07 января 2019

Есть 4 уникальных принятых запроса и всего 5 запросов. Таким образом, ставка составляет 0,80.

Я думаю, этот запрос должен сделать это:

SELECT
    ROUND(COALESCE(acc.cnt/NULLIF(req.cnt, 0), 0), 2)
FROM 
    (SELECT COUNT(*) cnt FROM friends_request) req,
    (SELECT COUNT(DISTINCT requester_id, accepter_id) cnt FROM request_accepted) acc

Что делает запрос, так это просто использует два подзапроса для вычисления обеих частей деления, которое выполняется во внешнем запросе:

  • req вычисляет знаменатель, т.е. общее количество запросов
  • acc вычисляет числитель, то есть количество различных принятых запросов

Я проверил это в этой скрипте БД , и он корректно возвращает 0.80 для ваших тестовых данных.

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