2010-02-24 3 views
1

Я пытаюсь выяснить SQLquery.Совокупный SQL-запрос с максимальным количеством строк для учета

У меня есть таблица данных голосования с team_id, ip_address и date_voted полей, и мне нужно, чтобы вернуть подсчет голосов по каждому team_id, но рассчитывать только первые 10 строк на IP-адрес в любой 24-часовой период.

ответ

0

Не успел проверить, но следующее должно сделать трюк.

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. 
+0

Включение оператора DISTINCT и 'ORDER BY' в подвыборке должно заставить это решение работать. – Sonny

+0

Извините mjv, я должен, конечно, быть более конкретным. Мне нужно общее количество за каждый 24-часовой период, который существует в таблице. , так, например, мне нужно общее количество строк, максимум 10 строк в день на ip-адрес, в понедельник, вторник, среду и т. Д. действительно ли это имеет смысл вообще или я waffling только имея смысл для себя? :) – David

+0

@David, см. Мои правки (Кстати, помимо добавления поддержки для подсчета итогов за каждый день, я добавил GROUP BY, которые я забыл изначально ...). Если вы каким-то образом заинтересованы в ДЕНЬ НЕДЕЛИ, а в отдельные дни просто измените 'YEAR (date_voted), DAYOFYEAR (date_voted)' на 'DAYOFWEEK (date_voted)' – mjv

0

Допущение: Только первые десять голосов для команды (каждая строка в таблице голосов голос за 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 
Смежные вопросы