Sql 选择子查询中最常出现的属性

Sql 选择子查询中最常出现的属性,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有这样一个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 ;WITH VotesCountCTE AS (

我有这样一个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
;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;
结果如下所示:

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
;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从我上面的示例中获取数字
27
我想获得用户投票最多的
PoliticianID

试试这个:

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)
)
或:带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) ;

更新 请注意:上述解决方案将为您提供所有最常见的发生ID,如果没有重复的最大值,这将正常工作。但是,如果您想获得排名靠前的ID,如果有许多ID具有与您在评论中发布的示例中相同的最大编号,您可以使用如下排名函数:

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
;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;
试试这个:

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)
)
或:带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) ;

更新 请注意:上述解决方案将为您提供所有最常见的发生ID,如果没有重复的最大值,这将正常工作。但是,如果您想获得排名靠前的ID,如果有许多ID具有与您在评论中发布的示例中相同的最大编号,您可以使用如下排名函数:

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
;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;

我想这应该行得通

SELECT TOP 1 NewsID, UserID, PoliticianID, COUNT(PoliticianID)
FROM Votes
WHERE UserID = 1010
GROUP BY NewsID, UserID, PoliticianID
ORDER BY COUNT(PoliticianID) DESC

我想这应该行得通

SELECT TOP 1 NewsID, UserID, PoliticianID, COUNT(PoliticianID)
FROM Votes
WHERE UserID = 1010
GROUP BY NewsID, UserID, PoliticianID
ORDER BY COUNT(PoliticianID) DESC
你可以试试这个

我已经创建了一个新的临时表来保存您的查询,并根据需要提供结果

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
你可以试试这个

我已经创建了一个新的临时表来保存您的查询,并根据需要提供结果

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


? 使用
groupby
HAVING
应该很容易做到这一点。我试过了,但没办法解决。有什么建议吗?你说你想得到
27
,但你说你想要的是投票最多的
politicalid
,实际上是
35
,我对你想要达到的目标有点困惑。我看不出你从哪里得到了投票最多的政治家是35,因为他被投了一次票,而27投了两次票。?使用
groupby
HAVING
应该很容易做到这一点。我试过了,但没办法解决。有什么建议吗?你说你想得到
27
,但你说你想要的是投票最多的
politicalid
,实际上是
35
,我有点搞不懂你想达到什么目的。我不知道你从哪里得到了投票最多的政治家是35,因为他被投了1次票,而27投了两次票。谢谢你,我是在尝试这样的事情,但我想我把我的问题复杂化了。这很好用。谢谢,我试过这样做,但我想我的问题太复杂了。这很有效。谢谢你的帮助。当我运行您的查询时,我再次得到5行结果。我得到的结果与我在上面的示例中只选择不同的…是一样的,但是使用
*
获取所有表字段,并且不将其限制在我上面的3个字段中。@ttkalec这应该可以很好地工作,在我的答案中的示例演示中也可以很好地工作。你能为你正在解释这个问题的实际查询设置一个演示示例吗?如果你只想选择3列,你可以在
select
列表中列出它们,而不是
select*
。我知道
select*
,我已经编辑了您的示例,以便您可以看到我运行查询时得到的结果。再次感谢您抽出时间@Talha设法解决了我的问题,因此您不必再浪费任何时间。@ttkalec-是的,您是对的,我的解决方案只适用于不重复的值,但在您发布的示例中,包含重复的最大值,您必须使用
TOP
,就像在@Talha solution中一样*顺便说一句:我不是在浪费时间。我和你一样只是在学习。你的评论让我脸上露出了笑容。Stackoverflow真的有一个很棒的社区:)谢谢你的帮助。当我运行您的查询时,我再次得到5行结果。我得到的结果与我在上面的示例中只选择不同的…是一样的,但是使用
*
获取所有表字段,并且不将其限制在我上面的3个字段中。@ttkalec这应该可以很好地工作,在我的答案中的示例演示中也可以很好地工作。你能为你正在解释这个问题的实际查询设置一个演示示例吗?如果你只想选择3列,你可以在
select
列表中列出它们,而不是
select*
。我知道
select*
,我已经编辑了您的示例,以便您可以看到我运行查询时得到的结果。再次感谢您抽出时间@Talha设法解决了我的问题,因此您不必再浪费任何时间。@ttkalec-是的,您是对的,我的解决方案只适用于不重复的值,但在您发布的示例中,包含重复的最大值,您必须使用
TOP
,就像在@Talha solution中一样*顺便说一句:我不是在浪费时间。我和你一样只是在学习。你的评论让我脸上露出了笑容。Stackoverflow确实有一个很棒的社区:)不,我得到了这个结果:
40 | 1010 | 10 | 5
。列名是您在解决方案中定义的。哦,对不起,我误解了您的问题。不用担心。不管怎样,你的答案是:)不,我得到这个结果:
40 | 1010 | 10 | 5
。列名是您在解决方案中定义的。哦,对不起,我误解了您的问题。不用担心。不管怎样,请回答Tnx:)