2016-05-20 14 views
0

Ich habe eine SQLite-Datenbank, die Informationen zu Brettspielen verfolgt (Name, Jahr veröffentlicht, Mechanik, Publisher, Anzahl der Personen, die es auf www.boardgamegeek.com besitzen, und boardgamegeeks aktuellen Rang für dieses Spiel). Das Schema ist:Wählen Sie maximale Summe für jedes Jahr in SQLite

Schema for database

Ich bin daran interessiert, die beliebtesten Mechaniker (der Mechaniker, der die höchste Anzahl von Kopien im Besitz hat) pro Jahr für einen bestimmten Verlag. Die aktuelle Abfrage ich habe, ist:

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; 

Das gibt:

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 

Was ich bin wirklich interessiert, ist nur das Jahr, Mechaniker, und die Summe von Kopien für Besitz, was auch immer Mechaniker hat die höchsten Summe jedes Jahr. Wie dies (können Bindungen gebrochen jedoch werden):

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 

ich glaube, ich könnte in der Abfrage einen anderen select-Anweisung müssen, aber ich kann nicht scheinen, um es zu bekommen zu arbeiten. Irgendwelche Vorschläge?

Antwort

0

Die Lösung traf mich einfach. Wenn Sie sich hier finden, ist das, wie ich es gemacht habe:

Ich wollte im Grunde das Maximum (Summe()) jeder Gruppe erhalten. Zuerst müssen Sie die Abfrage herausfinden, die alle Daten enthält (dies ist die erste Abfrage, die ich hatte). Für mich ist es:

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; 

Was dies zurückgibt, ist in der Hauptfrage. Als nächstes wollen wir daraus auswählen. Ich habe Interesse an:

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

Der Trick besteht darin, dass jede Tabelle in der ersten Abfrage genannt werden muss (für mich ist das Jahr, mech, und sm), so dass Sie später darauf kommen können. Die letzte Abfrage ist:

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; 

Ich hoffe, das ergibt Sinn!