Опитвам се да разбера SQLquery.
Имам таблица с данни за гласуване с полета team_id
, ip_address
и date_voted
и трябва да върна броя на гласовете за всяко team_id
, но да броя само първите 10 реда на IP адрес за всеки период от 24 часа.
Опитвам се да разбера SQLquery.
Имам таблица с данни за гласуване с полета team_id
, ip_address
и date_voted
и трябва да върна броя на гласовете за всяко team_id
, но да броя само първите 10 реда на IP адрес за всеки период от 24 часа.
Нямах време да проверя, но следното трябва да свърши работа.
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.
DISTINCT
и клауза ORDER BY
в подизбора трябва да направи това решение да работи.
- person Sonny; 24.02.2010
YEAR(date_voted), DAYOFYEAR(date_voted)
с DAYOFWEEK(date_voted)
- person mjv; 24.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