2012-04-24 9 views
1

私は以下のようなOracleのテーブルを持って選択します。今、ユーザーが複数回投票することができオラクル - 個別のユーザーによる最も投票項目

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

を。私はこの質問で苦労しています:最も多く投票された項目を取得一意に - 同じ人からの複数の票が1つだけを意味することを意味します。

SQL Serverの場合は、tempテーブルなどを作成している可能性がありますが、Oracleでの処理方法はわかりません。私はまた、ネクタイを扱う方法を考えるのに苦労しています。つまり、2つの商品に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

オラクルサポートCTE構文ですか? –

+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クエリはほとんど同じユーザ(あなたがアプリケーションに返される行を制限する必要があります)することで、複数の票を考慮しない、アイテムを投票返す:あなたは本当に制限する必要がある場合は

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 
関連する問題