【问题标题】:Select max sum for each year in SQLite在 SQLite 中选择每年的最大总和
【发布时间】:2016-05-20 01:40:05
【问题描述】:

我有一个 SQLite 数据库,用于跟踪有关棋盘游戏的信息(名称、发布年份、机制、发行商、在 www.boardgamegeek.com 上拥有该游戏的人数,以及 boardgamegeek 目前对该游戏的排名)。架构是:

我有兴趣为特定出版商获取每年最受欢迎的机制(拥有最多副本的机制)。我目前的查询是:

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

我想我可能需要在查询中使用另一个 select 语句,但我似乎无法让它工作。有什么建议吗?

【问题讨论】:

    标签: sql sqlite select


    【解决方案1】:

    解决方案刚刚击中我。如果你发现自己在这里,我就是这样做的:

    我基本上想得到每个组的 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)
    

    诀窍是第一个查询中的每个表都需要命名(对我来说是 yr、mech 和 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;
    

    我希望这是有道理的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多