Допущение: Только первые десять голосов для команды (каждая строка в таблице голосов голос за team_id) от данного IP-адреса следует рассчитывать на определенную дату.
Итак, вот сырые голоса за команду в день.
select team_id, vote_date, ip_address, count(*) as raw_vote_count
from votes
group by team_id, vote_date, ip_address
Теперь, используя это, исправить число голосов вниз не более чем на десять с выражением CASE-:
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
Включение оператора DISTINCT и 'ORDER BY' в подвыборке должно заставить это решение работать. – Sonny
Извините mjv, я должен, конечно, быть более конкретным. Мне нужно общее количество за каждый 24-часовой период, который существует в таблице. , так, например, мне нужно общее количество строк, максимум 10 строк в день на ip-адрес, в понедельник, вторник, среду и т. Д. действительно ли это имеет смысл вообще или я waffling только имея смысл для себя? :) – David
@David, см. Мои правки (Кстати, помимо добавления поддержки для подсчета итогов за каждый день, я добавил GROUP BY, которые я забыл изначально ...). Если вы каким-то образом заинтересованы в ДЕНЬ НЕДЕЛИ, а в отдельные дни просто измените 'YEAR (date_voted), DAYOFYEAR (date_voted)' на 'DAYOFWEEK (date_voted)' – mjv