выберите максимум суммы sqlite - PullRequest
1 голос
/ 10 апреля 2019

у меня есть результаты из некоторых таблиц, таких как это (700 строк)

country         province       purchase_power 
Angola          Cuanza Sul          10
Angola          Huambo              2
Angola          Namibe              2
Angola          Uige                12
Argentina       Buenos Aires        15
Argentina       Catamarca           3
Argentina       Corrientes          1
Argentina       Jujuy               13
Argentina       La Rioja            17
Argentina       Mendoza             1
Argentina       Misiones            1
Argentina       Neuquen             2
Argentina       San Juan            10
Argentina       San Luis            4
Argentina       Santa Cruz          1

Я получил это с помощью этого запроса

select  c.name as country,p.name as province,sum(qty) as purchase_power
from province p,purchases,country c
where P.rowid = Purchases.province and qty>0 and c.code=p.country and product=0  
group by p.name 

я хочу только провинцию с самой высокой покупательной способностью для каждой страны

производительность следует считать

ex output 
country         province       purchase_power 
Angola          Uige                12
Argentina       La Rioja            17

1 Ответ

1 голос
/ 10 апреля 2019

Первые примечания:

  • Вы должны использовать явные объединения вместо неявных.
  • Также вы должны добавить c.name к group by.
  • ХотяSQLite позволяет выбирать столбцы, не используемые в предложении group by, если вы не хотите сюрпризов, вы должны следовать стандартному SQL.

Теперь, поскольку производительность является проблемой, вы можете использовать CTEдля вашего запроса и выполните его только один раз, чтобы использовать его результаты:

with cte as (
  select 
    c.name as country,
    p.name as province,
    sum(t.qty) as purchase_power
  from province p 
  inner join purchases t on p.rowid = t.province
  inner join country c on c.code = p.country 
  where t.qty > 0 and t.product=0  
  group by c.name, p.name
)
select cte.* from cte 
inner join (
  select country, max(purchase_power) purchase_power
  from cte
  group by country
) t on t.country = cte.country and t.purchase_power = cte.purchase_power
...