按事件分组统计SQL Server用户投票表的热门反应
如何创建SQL Server视图汇总事件的最高得票反应?
我来帮你搞定这个需求!你需要处理一张记录用户对事件投票/反应的表,想要做个汇总视图,按事件分组展示每个事件里得票最多的反应对吧?先看你的示例表结构和测试数据:
DECLARE @voteTable AS TABLE ( id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, eventId VARCHAR(255) NOT NULL , isGroupA INT NOT NULL , isGroupB INT NOT NULL , userVote VARCHAR(255) NOT NULL ); INSERT INTO @voteTable (eventId, isGroupA, isGroupB, userVote) VALUES ('event1', 1, 0, 'like'), ('event1', 1, 0, 'like'), ('event1', 0, 1, 'dislike'), ('event2', 1, 0, 'laugh'), ('event2', 0, 1, 'laugh'), ('event2', 0, 1, 'sad');
解决方案:创建带排名逻辑的汇总视图
这里用SQL Server的窗口函数就能轻松实现,直接上创建视图的代码:
CREATE VIEW vw_TopVotePerEvent AS WITH VoteCounts AS ( -- 第一步:统计每个事件下各反应的得票次数 SELECT eventId, userVote, COUNT(*) AS VoteCount FROM voteTable -- 记得替换成你实际的表名 GROUP BY eventId, userVote ), RankedVotes AS ( -- 第二步:给每个事件内的反应按得票数排序 SELECT eventId, userVote, VoteCount, -- 按事件分组,得票数降序排列,排名第一的就是得票最多的 ROW_NUMBER() OVER (PARTITION BY eventId ORDER BY VoteCount DESC) AS VoteRank FROM VoteCounts ) -- 第三步:筛选出每个事件里排名第一的反应 SELECT eventId, userVote AS TopReaction, VoteCount AS TopReactionVoteCount FROM RankedVotes WHERE VoteRank = 1;
额外说明
- 如果你的场景允许多个反应并列得票最高(比如某事件里like和dislike票数相同),可以把
ROW_NUMBER()换成RANK(),这样所有并列第一的反应都会被保留。 - 视图创建完成后,直接执行
SELECT * FROM vw_TopVotePerEvent就能看到每个事件的最高得票反应汇总结果啦!
内容的提问来源于stack exchange,提问作者potorik
相关产品推荐
相关产品推荐

