выберите максимальное значение sum sqlite

#sql #sqlite #sum #max

#sql #sqlite #сумма #максимальное

Вопрос:

у меня есть результаты из некоторых таблиц, подобных этой, с (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. select * from t group by country having max(purchase_power);

Ответ №1:

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

  • Вы должны использовать явные объединения вместо неявных.
  • Также необходимо добавить 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
  

Комментарии:

1. те же результаты ? что вы имеете в виду?

2. [22:22:56] SQLiteStudio не удалось извлечь метаданные из запроса. Результаты не будут доступны для редактирования.

3. и он дал те же избыточные области, что и мой предыдущий запрос

4. я не могу отблагодарить вас достаточно, теперь он работает на 100% правильно, большое вам спасибо.

5. я внес некоторые изменения в запрос, и теперь он отображается c.name как страна, p.name как провинция, sum(qty) как purchase_power, count( ) как abs, cast(sum(qty) как float) / count( ) как prop, но я не смог удалить sum sum(кол-во) как purchase_power, и я не нашел способа обойти это