使用要考虑的最大行数聚合SQL查询
我正试图找出一个SQLquery使用要考虑的最大行数聚合SQL查询,sql,mysql,group-by,Sql,Mysql,Group By,我正试图找出一个SQLquery 我有一个带有团队id、ip地址和日期投票字段的投票数据表,我需要返回每个团队id的投票计数,但在任何24小时内仅计算每个ip地址的前10行 还没来得及检查,但下面的内容应该可以解决问题 SELECT Yr, DoY, team_id, SUM(IF NbVote < 10, NbVote, 10) As FilteredVoteCount FROM ( SELECT YEAR(date_voted) AS Yr, DAYOFYEAR(date_vote
我有一个带有团队id、ip地址和日期投票字段的投票数据表,我需要返回每个团队id的投票计数,但在任何24小时内仅计算每个ip地址的前10行 还没来得及检查,但下面的内容应该可以解决问题
SELECT Yr, DoY, team_id, SUM(IF NbVote < 10, NbVote, 10) As FilteredVoteCount
FROM (
SELECT YEAR(date_voted) AS Yr, DAYOFYEAR(date_voted) AS DoY,
team_id,
ip_address,
COUNT(*) AS NbVotes
FROM myTable
-- WHERE here for some possible extra condition.
GROUP BY YEAR(date_voted), DAYOFYEAR(date_voted), team_id, ip_address
)
GROUP BY Yr, DoY, team_id
ORDER BY Yr, DoY, team_id -- or some other order may be desired.
假设:投票表中每一行只有一个团队的前十票是来自给定IP地址的团队id的投票,在给定的日期应计算在内 这是每个团队每天的原始投票
select team_id, vote_date, ip_address, count(*) as raw_vote_count
from votes
group by team_id, vote_date, ip_address
现在,使用该选项,使用大小写表达式将投票数更正为不超过10:
select team_id, vote_date, ip_address,
case when raw_vote_count > 10
then 10
else raw_vote_count
end as adjusted_vote_count
from (select team_id, vote_date, ip_address, count(*) as raw_vote_count
from votes
group by team_id, vote_date, ip_address
) sub1
如果你想得到每天的总票数,那么:
select team_id, sum(adjusted_vote_count)
from (
select team_id, vote_date, ip_address,
case when raw_vote_count > 10
then 10
else raw_vote_count
end as adjusted_vote_count
from (select team_id, vote_date, ip_address, count(*) as raw_vote_count
from votes
group by team_id, vote_date, ip_address
) sub1
)
where date = :mydate
group by team_id
order by team_id
在子选择中放置一个独特的语句和ORDERBY子句应该可以使这个解决方案起作用。对不起,mjv,我当然应该更具体一些。我需要表中存在的每24小时的总计数。例如,我需要周一、周二、周三等的总行数,每个ip地址每天最多10行。这有意义吗?还是我只是在胡扯,只对自己有意义@David,顺便说一句,看我的编辑除了添加对计算每天总数的支持之外,我还添加了我最初忘记的分组BY。。。。如果你对一周中的某一天而不是某一天感兴趣,只需更改YEARdate,DAYOFYEARdate,DAYOFYEARdate,DAYOFWEEKdate,你是超级明星!这使我走上了正确的道路,尽管有几个小错误:IF语句需要一组括号,而内部select语句需要一个别名。否则我就省去了几个小时的挠头!太感谢你了!