Sql 选择子查询中最常出现的属性
我有这样一个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 (
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:)