是否可以执行从不同列中选择两个最大/最小值的单个SQL查询?
我正在开始使用SQLite。我已经完成了两个教程,它们为我提供了是否可以执行从不同列中选择两个最大/最小值的单个SQL查询?,sql,sqlite,group-by,Sql,Sqlite,Group By,我正在开始使用SQLite。我已经完成了两个教程,它们为我提供了SQL语句的全局视图。我想我可以通过几个简单的查询来完成我的任务。然而,出于学术上的原因,我想将它们组合成一个更复杂的查询 让我们看看我的问题,假设我有这个表: +---------+-------+--------+-------------+ | Product | Kcal | Price | Supermarket | +---------+-------+--------+-------------+ milk
SQL
语句的全局视图。我想我可以通过几个简单的查询来完成我的任务。然而,出于学术上的原因,我想将它们组合成一个更复杂的查询
让我们看看我的问题,假设我有这个表:
+---------+-------+--------+-------------+
| Product | Kcal | Price | Supermarket |
+---------+-------+--------+-------------+
milk 300 1.01 Carrefour
eggs 75 1.50 Carrefour
bread 400 1.99 Carrefour
milk 150 1.20 Lidl
eggs 50 2.00 Lidl
bread 300 1.50 Lidl
假设我想要这个输出:
+-------------+----------+---------+-----------+---------+
| Supermarket | Max Kcal | Product | Min Price | Product |
+-------------+----------+---------+-----------+---------+
Carrefour 400 bread 1.01 milk
Lidl 300 bread 1.20 milk
检索与最大/最小值关联的键的简单查询是:
sql = ('SELECT PRODUCT, Supermarket '
'from PRODUCTS '
'where KCAL = (SELECT MAX(KCAL) from PRODUCTS) ')
我尝试使用groupby
语句来检索按“supermarket”分组的所有max“kcal”
以及按“超市”分组的所有最低“价格”
但是,我没有找到任何关于如何将这两个查询组合在一个查询中的线索,目的是一次性访问数据库并减少所花费的时间
有可能吗?还是我不得不问几个问题
我可能过度简化了我的问题,但我有一个500MB的数据库,其中有很多表,每次我都需要一个按公共键排序的最大/最小值(“超级市场”)。我需要很多每次需要几分钟的查询
我想知道如果Kcals和price在不同的表中是否会有区别,我还没有尝试组合来自不同表的查询(我从简单到复杂)
谢谢大家! 您需要两个查询,但要获得组的最大值和最小值,您需要小心。所以我建议你检查一下这个问题的答案:你还需要解决在关系出现的情况下会发生什么 现在关于你的问题,如果你有两个基于超市的查询,你只需要加入它们
SELECT Q1.Supermarket, Q1.`Max Kcal`, Q1.`Product`,
Q2.`Min Price`, Q2.`Product`
FROM ( Query1 ..) as Q1
JOIN ( Query2 ..) as Q2
ON Q1.Supermarket = Q2.Supermarket
试试看,不知道你想达到什么样的效果,但据我所知,每个商店的同一个产品都有不同的cal和价格,所以你试图得到最便宜的cal和最便宜的价格
Select minprice.Supermarket, MaxCal.Kcal, MaxCal.Product, MinPrice.Price,MinPrice.Product
From (
Select supermarket, Min(price) Price, Product from #products
Group by Supermarket, Product
) MinPrice
Left Join (
Select Supermarket, Max(kcal) as Kcal, Product from #products
Group by Supermarket, Product ) MaxCal on MinPrice.Supermarket = MaxCal.Supermarket
and MaxCal.Product= MinPrice.Product
这个想法是创建两个表 第一张表(如表A)包含超市、最大千卡、产品 包含超市、最低价格、产品的第二张表(如表B) 然后您可以将两个表合并到一个表中。这可以在一个查询中完成。看到我的答案了吗 查询如下所示:
SELECT A.supermarket,
A.max_kcal,
C.NAME,
B.min_price,
D.NAME
FROM (SELECT supermarket,
Max(kcal) AS max_kcal
FROM product
GROUP BY supermarket) AS A
JOIN (SELECT supermarket,
Min(price) AS min_price
FROM product
GROUP BY supermarket) AS B
ON A.supermarket = B.supermarket
JOIN product C
ON C.kcal = A.max_kcal
AND C.supermarket = A.supermarket
JOIN product D
ON D.price = B.min_price
AND D.supermarket = B.supermarket
ORDER BY A.supermarket;
我使用附加的表C和D来获得产品名称。
希望这有帮助 您是否尝试将
超市列上的两个结果集,即“最大kcal”集和“最小价格”集合并?假设给定超市的max(kcal)
为500,但有8种不同的产品有500 kcal。您希望输出的内容是什么?谢谢,它帮助了您很多。您只需要在最后添加一个orderby
。请小心,如果你使用相同的max_KCal多元素,这也会有问题。谢谢你,我会仔细研究你的两个技巧(max/min问题和联系)。您的代码部分工作,我还不明白为什么,但在更大的场景中,与最大/最小值相关的产品没有正确恢复。我不知道这是否与你正在谈论的问题有关@Ebed Kharistian针对解决此问题的产品的附加JOIN
语句。
Select minprice.Supermarket, MaxCal.Kcal, MaxCal.Product, MinPrice.Price,MinPrice.Product
From (
Select supermarket, Min(price) Price, Product from #products
Group by Supermarket, Product
) MinPrice
Left Join (
Select Supermarket, Max(kcal) as Kcal, Product from #products
Group by Supermarket, Product ) MaxCal on MinPrice.Supermarket = MaxCal.Supermarket
and MaxCal.Product= MinPrice.Product
SELECT A.supermarket,
A.max_kcal,
C.NAME,
B.min_price,
D.NAME
FROM (SELECT supermarket,
Max(kcal) AS max_kcal
FROM product
GROUP BY supermarket) AS A
JOIN (SELECT supermarket,
Min(price) AS min_price
FROM product
GROUP BY supermarket) AS B
ON A.supermarket = B.supermarket
JOIN product C
ON C.kcal = A.max_kcal
AND C.supermarket = A.supermarket
JOIN product D
ON D.price = B.min_price
AND D.supermarket = B.supermarket
ORDER BY A.supermarket;