2016-05-20 5 views
0

У меня есть база данных SQLite, которая отслеживает информацию на настольных играх (имя, год публикации, механики, издатели, количество людей, которые владеют им на www.boardgamegeek.com, и текущий рейтинг boardgamegeek для эта игра). Схема является:Выберите максимальную сумму за каждый год в SQLite

Schema for database

Я заинтересован в получении наиболее популярных механик (механик, который имеет наибольшее количество копий, находящиеся в собственности) в год для конкретного издателя. Текущий запрос у меня есть:

select games.year as yr, mechanics.name as mech, sum(collection.owned) as sm 
from games 
inner join gamemech on games.bggid = gamemech.bggid 
inner join mechanics on gamemech.mechid = mechanics.mechid 
inner join gamepub on gamepub.bggid = games.bggid 
inner join publishers on publishers.pubid = gamepub.pubid 
inner join collection on collection.bggid = games.bggid 
where publishers.name like '%stronghold%' 
group by yr, mech order by yr limit 20; 

Это возвращает:

1974|Commodity Speculation|1460 
1974|Dice Rolling|1460 
1974|Tile Placement|1460 
1982|Action Point Allowance System|16111 
1982|Dice Rolling|16111 
1982|Modular Board|16111 
1982|Secret Unit Deployment|16111 
1985|PaperandPencil|1949 
1991|Auction/Bidding|1266 
1992|Grid Movement|1704 
1992|Pickup and Deliver|1704 
2011|Action Point Allowance System|7943 
2011|Area Control/Area Influence|174 
2011|Area Movement|3607 
2011|Auction/Bidding|174 
2011|Card Drafting|5133 
2011|Deck/Pool Building|3768 
2011|Dice Rolling|2385 
2011|Hand Management|5663 
2011|Line Drawing|2141 

То, что я на самом деле интересует только год, механика, и сумма экземпляров принадлежащих к любой механик имеет самый высокий сумма каждый год. Как это (связи может быть нарушена, однако):

1974|Commodity Speculation|1460 
1982|Action Point Allowance System|16111 
1985|PaperandPencil|1949 
1991|Auction/Bidding|1266 
1992|Grid Movement|1704 
2011|Action Point Allowance System|7943 

Я думаю, что, возможно, потребуется еще один оператор выбора в запросе, но я не могу заставить его работать. Какие-либо предложения?

ответ

0

Решение просто ударило меня. Если вы оказались здесь, вот как я это сделал:

Я в основном хотел получить max (sum()) каждой группы. Прежде всего вам нужно выяснить, какой запрос содержит все данные (это первый запрос, который у меня был). Для меня это:

select games.year as yr, mechanics.name as mech, sum(collection.owned) as sm 
from games 
inner join gamemech on games.bggid = gamemech.bggid 
inner join mechanics on gamemech.mechid = mechanics.mechid 
inner join gamepub on gamepub.bggid = games.bggid 
inner join publishers on publishers.pubid = gamepub.pubid 
inner join collection on collection.bggid = games.bggid 
where publishers.name like '%stronghold%' 
group by yr, mech order by yr limit 20; 

Что это значит, это главный вопрос. Затем мы хотим выбрать из этого. Я заинтересован в:

games.year, mechanics.name, max(sm) 

Хитрость заключается в том, что каждая таблице в первом запросе должна быть названа (для меня это год, механ, и см), так что вы можете присоединиться к нему позже. Конечный запрос:

Select games.year, mechanics.name, max(sm) from (
select games.year as yr, mechanics.name as mech, sum(collection.owned) as sm 
from games 
inner join gamemech on games.bggid = gamemech.bggid 
inner join mechanics on gamemech.mechid = mechanics.mechid 
inner join gamepub on gamepub.bggid = games.bggid 
inner join publishers on publishers.pubid = gamepub.pubid 
inner join collection on collection.bggid = games.bggid 
where publishers.name like '%stronghold%' 
group by yr, mech) 
inner join games on games.year = yr 
inner join mechanics on mechanics.name = mech 
group by yr; 

Надеюсь, это имеет смысл!

Смежные вопросы