2012-04-24 85 views
1

我有一个像下面Oracle表:甲骨文 - 选择最由不同的用户投票项目

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

现在,用户可以多次投票。我很难与这个查询:获得最多投票项目唯一 - 意味着来自同一个人的多票投票只计为一个。

如果是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已投不同的用户。所以你将有每个项目ID唯一的用户。我不知道你想要什么输出,所以我下令让首票最多的物品。如果你只想要一个前10名的东西,你可以很容易地将它添加到选择。

+0

确实oracle支持CTE语法吗? – 2012-04-24 13:17:33

+0

yes .. http://beyondrelational.com/modules/2/blogs/70/posts/10947/usage-of-cte-sql-server-vs-oracle.aspx – Arion 2012-04-24 13:20:34

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查询返回的大部分投项目,不考虑同一用户多张选票(你将不得不限制返回的行到你的应用程序):

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