2

次のような SQL クエリがあります。

SELECT DISTINCT NewsID, UserID, PoliticianID
FROM Votes
WHERE UserID = 1010

結果は次のようになります。

NewsID | UserID | PoliticianID
40       1010     3
40       1010     10
38       1010     27
39       1010     27
40       1010     35

27上記の例から SQL を使用して数値を取得する方法はありますか? ユーザーから最も多く投票された
ものを取得したいと思います。PoliticianID

4

3 に答える 3

2

これを試して:

SELECT *
FROM Votes
WHERE PoliticianID IN
(
    SELECT PoliticianID
    FROM votes 
    GROUP BY PoliticianID
    HAVING  COUNT(NewsID) = (SELECT MAX(NCount)
                             FROM
                             (
                               SELECT COUNT(*) NCount
                               FROM Votes
                               GROUP BY PoliticianID, UserId
                             ) t)
)

SQL フィドルのデモ

または: CTE の場合:

;WITH TheMostOccurredIds
AS
(
  SELECT PoliticianID
  FROM votes 
  GROUP BY PoliticianID
  HAVING  COUNT(NewsID) = (SELECT MAX(NCount)
                           FROM
                           (
                             SELECT COUNT(*) NCount
                             FROM Votes
                             GROUP BY PoliticianID, userID
                           ) t)
  )
SELECT *
FROM Votes
WHERE PoliticianID IN (SELECT PoliticianID FROM TheMostOccurredIds) ;

CTE を使用した SQL Fiddle デモ


アップデート

注:上記のソリューションは、最も多く出現するIDをすべて提供します。最大値が重複していない場合、これは正常に機能します。ただし、コメントに投稿した例のように、最大​​数が同じ ID が多数ある場合は、TOP を取得したい場合は、次のようなランキング関数を使用できますROW_NUMBER() OVER(...)

;WITH VotesCountCTE
AS
(
  SELECT [UserID], [PoliticianID], COUNT(*) votesCount
  FROM votes
  GROUP BY [UserID], [PoliticianID]
),TopVotes
AS
(
  SELECT *,
  ROW_NUMBER() OVER(ORDER BY votescount) rownum
  FROM VotesCountCTE
 )
SELECT *
FROM TopVotes
WHERE rownum = 1;

更新された SQL フィドル

于 2012-12-10T11:27:08.290 に答える
2

これを試すことができます

クエリを保持し、必要に応じて結果を提供する新しい TEMP テーブルを作成しました。

SELECT TOP 1 PoliticianID, COUNT(PoliticianID) AS CNT
FROM 
    (SELECT DISTINCT NewsID, UserID, PoliticianID
     FROM Votes
     WHERE UserID = 1010) AS tempT
GROUP BY PoliticianID
ORDER BY CNT DESC
于 2012-12-10T11:35:58.847 に答える
0

私はこれがうまくいくはずだと思います...

SELECT TOP 1 NewsID, UserID, PoliticianID, COUNT(PoliticianID)
FROM Votes
WHERE UserID = 1010
GROUP BY NewsID, UserID, PoliticianID
ORDER BY COUNT(PoliticianID) DESC
于 2012-12-10T11:29:51.713 に答える