2016-08-24 2 views
4

Напишите запрос для печати hacker_id, имени и общего количества вызовов, созданных каждым учащимся. Сортируйте результаты по общему количеству проблем в порядке убывания. Если более одного ученика создало такое же количество проблем, то отсортируйте результат с помощью hacker_id. Если более одного ученика создало столько же задач, и количество меньше, чем максимальное количество созданных задач, то исключайте этих учащихся из результата.Исключить результаты на основе тестовых примеров

Я также прикрепил изображения для соответствующих таблиц

Таблица Хакеры:

hacker_id name 
    5077 Rose 
    21283 Angela 
    62743 Frank 
    88255 Patrick 
    96196 Lisa 

Таблица Проблемы:

challenge_id hacker_id 
     61654  5077 
     58302  21283 
     40587  88255 
     29477  5077 
     1220  21283 
     69514  21283 
     46561  62743 
     58077  62743 
     18483  88255 
     76766  21283 
     52382  5077 
     74467  21283 
     33625  96196 
     26053  88255 
     42665  62743 
     12859  62743 
     70094  21283 
     34599  88255 
     54680  88255 
     61881  5077 

Итак, пока я сделал это

SELECT c.hacker_id, h.name, COUNT(c.challenge_id) AS challenge_count 
FROM Challenges c LEFT JOIN Hackers h on c.hacker_id = h.hacker_id 
GROUP by 1,c.hacker_id HAVING challenge_count >= 
MAX(challenge_count) ORDER BY challenge_count DESC ,c.hacker_id DESC; 

Но не получать ожидаемый выход. Мой выход

enter image description here

Мне нужно, чтобы исключить повторяющиеся результаты вывода, такие как хакеры с таким же количеством проблем, должен быть исключен.

+0

Итак, кого следует исключать здесь? – sagi

+0

Хакеры с таким же количеством проблем должны быть исключены, если количество проблемных значений меньше максимального значения. Если у двух хакеров одинаковое количество проблем, и это максимальная ценность, то и хакеры должны быть включены –

+0

@sagi По крайней мере, он согласен :-) –

ответ

3

Есть несколько критериев здесь:

  1. hacker_id, имя, а общее количество вызовов, создаваемых каждой студенческой
  2. сортировать результаты по общему количеству вызовов в порядке убывания.
  3. Если несколько студентов создали столько же задач, а затем отсортируйте результат с помощью hacker_id.
  4. Если более одного ученика создало такое же количество проблем, то исключайте учащихся из результата.
  5. За исключением, если число равно максимальное число вызовов, созданных,

следующие сделки с пунктами 1,2, & 3 ...

SELECT h.* 
    , COUNT(c.challenge_id) challenge_count 
    FROM hackers h 
    JOIN challenges c 
    ON c.hacker_id = h.hacker_id 
GROUP 
    BY h.hacker_id 
ORDER 
    BY challenge_count DESC, hacker_id; 

Мы можем присоединиться к этому запрос к себе когда-то , разрешить критерии 4 и снова разрешить пункт 5 следующим образом:

SELECT DISTINCT a.* 
      FROM 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) a 
      LEFT 
      JOIN 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) b 
      ON b.hacker_id <> a.hacker_id AND b.challenge_count = a.challenge_count 
      LEFT 
      JOIN 
       (SELECT h.* 
        , COUNT(c.challenge_id) challenge_count 
        FROM hackers h 
        JOIN challenges c 
        ON c.hacker_id = h.hacker_id 
       GROUP 
        BY h.hacker_id 
      ) c 
      ON c.challenge_count > a.challenge_count 
      WHERE b.hacker_id IS NULL 
      OR c.hacker_id IS NULL 
      ORDER 
      BY challenge_count DESC, hacker_id; 
+0

Супервырадный ... большое спасибо –

+0

хороший ответ –

2
SELECT t1.name, 
     t1.hacker_id, 
     COALESCE(t2.challengeCount, 0) AS challengeCount 
FROM Hackers t1 
LEFT JOIN 
(
    SELECT hacker_id, COUNT(*) AS challengeCount 
    FROM Challenges 
    GROUP BY hacker_id 
) t2 
    ON t1.hacker_id = t2.hacker_id 
WHERE COALESCE(t2.challengeCount, 0) IN 
(
    SELECT t1.challengeCount 
    FROM 
    (
     SELECT t1.hacker_id, 
       COALESCE(t2.challengeCount, 0) AS challengeCount 
     FROM Hackers t1 
     LEFT JOIN 
     (
      SELECT hacker_id, COUNT(*) AS challengeCount 
      FROM Challenges 
      GROUP BY hacker_id 
     ) t2 
      ON t1.hacker_id = t2.hacker_id 
    ) t1 
    GROUP BY t1.challengeCount 
    HAVING COUNT(*) = 1 
) OR COALESCE(t2.challengeCount, 0) = 
(
    SELECT MAX(t.challengeCount) FROM 
    (
     SELECT COUNT(*) AS challengeCount 
     FROM Challenges GROUP BY hacker_id 
    ) t 
) 
ORDER BY COALESCE(t2.challengeCount, 0) DESC, 
     t1.hacker_id 
+0

что это t2 здесь ?? Настольные вызовы? –

+1

't2' - это просто таблица _alias_. –

+0

Я попытался выполнить ваш запрос, но он показывает только хакеров с максимальным количеством проблем. –