Обобщена SQL заявка с максимален брой редове, които трябва да се вземат предвид

Опитвам се да разбера SQLquery.

Имам таблица с данни за гласуване с полета team_id, ip_address и date_voted и трябва да върна броя на гласовете за всяко team_id, но да броя само първите 10 реда на IP адрес за всеки период от 24 часа.


person David    schedule 24.02.2010    source източник


Отговори (2)


Нямах време да проверя, но следното трябва да свърши работа.

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.
person mjv    schedule 24.02.2010
comment
Поставянето на оператор DISTINCT и клауза ORDER BY в подизбора трябва да направи това решение да работи. - person Sonny; 24.02.2010
comment
съжалявам, mjv, разбира се, трябваше да бъда по-конкретен. имам нужда от общия брой за всеки 24-часов период, който съществува в таблицата. така, например, имам нужда от общ брой редове, до максимум 10 реда на ден на ip адрес, за понеделник, вторник, сряда и т.н. има ли смисъл това изобщо или се лутам, че има смисъл само на себе си? :) - person David; 24.02.2010
comment
@David, виж моите редакции (BTW освен добавянето на поддръжка за изчисляване на суми за всеки ден, добавих GROUP BY, които бях забравил първоначално...). Ако по някакъв начин се интересувате от ДЕНЯ ОТ СЕДМИЦАТА, а не от отделни дни, просто сменете YEAR(date_voted), DAYOFYEAR(date_voted) с DAYOFWEEK(date_voted) - person mjv; 24.02.2010
comment
ах mjv, ти суперзвезда! това ме постави на прав път, въпреки че имаше няколко малки грешки: операторът IF се нуждаеше от набор от скоби, а вътрешният select имаше нужда от псевдоним. иначе това ми спести часове чесане по главата! не мога да ти благодаря достатъчно! - person David; 25.02.2010

Предположение: Само първите десет гласа за отбор (всеки ред в таблицата с гласове е глас за 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
person Adam Musch    schedule 24.02.2010