2012-04-24 6 views
1

У меня есть таблицы оракула, как показано ниже:Oracle - выбрать наиболее голосовал детали различных пользователей

User - UserId, 
Item - ItemId, 
UserVote - UserVoteId, UserId, ItemId. 

Теперь пользователь может проголосовать несколько раз. Мне сложно с этим запросом: Получить товар (ы) больше всего голосов uniquely - что означает несколько голосов от одного и того же человека, считая только одним.

Если бы это был SQL Server, я мог бы создать временную таблицу и все, но я не знаю, как обращаться в Oracle. Мне также трудно думать о том, как обращаться с галстуком, а это значит, что если два предмета имеют 18 «уникальных» голосов. Я хотел бы получить оба предмета в этом случае.

ответ

1
select ItemID, 
     VoteCount 
from 
    (
    select ItemID, 
      count(distinct UserId) as VoteCount, 
      rank() over(order by count(distinct UserId) desc) as rn 
    from UserVote 
    group by ItemID 
) U 
where rn = 1; 
1

Может быть что-то вроде этого:

WITH CTE 
AS 
(
    SELECT 
     COUNT(DISTINCT UserId) AS votes, 
     item.ItemId 
    FROM 
     UserVote 
    GROUP BY 
     item.ItemId 
) 
SELECT 
    * 
FROM 
    item 
    LEFT JOIN CTE 
     CTE.ItemId=item.ItemId 
ORDER BY 
    votes DESC; 

Это COUNT пользователей, которые голосовали различны. Таким образом, у вас будут уникальные пользователи на идентификатор элемента. Я не знаю, какой результат вы хотите, поэтому я приказал так, чтобы элемент с наибольшим количеством голосов был первым. Если вы хотите только топ-10 или что-то, что вы можете легко добавить к выбору.

+0

есть ли синтаксис синтаксиса оракула? –

+0

да .. http://beyondrelational.com/modules/2/blogs/70/posts/10947/usage-of-cte-sql-server-vs-oracle.aspx – Arion

3
SELECT * 
FROM (
     SELECT q.*, 
       DENSE_RANK() OVER (ORDER BY votes DESC) AS dr 
     FROM (
       SELECT itemId, COUNT(DISTINCT userId) AS votes 
       FROM userVote 
       GROUP BY 
         itemId 
       ) q 
     ) 
WHERE dr = 1 
0

Как насчет

SELECT "ItemId", COUNT(*) AS "VoteCount" 
    FROM (SELECT DISTINCT "ItemId", "UserID" 
      FROM "UserVote") a 
    GROUP BY "ItemId" 
    ORDER BY COUNT(*) DESC 

Делите и наслаждайтесь.

0

Следующий запрос ANSI возвращает наибольшее количество голосов Items, не считая нескольких голосов от того же пользователя (вы должны ограничить возвращаемые строки в приложении):

SELECT ItemId, COUNT(DISTINCT UserId) AS "votes" 
FROM UserVote 
GROUP BY ItemId 
ORDER BY "votes" DESC; 

Если вам действительно нужно ограничить количество строк в запросе, вы можете сделать это с помощью диалекта Oracle SQL:

SELECT ItemId, votes 
FROM (
    SELECT ItemId, COUNT(DISTINCT UserId) AS "votes" 
    FROM UserVote 
    GROUP BY ItemId 
    ORDER BY "votes" DESC 
) 
WHERE ROWNUM <= :n; -- :n is a placeholder for the number of rows to return 
Смежные вопросы