过去两个小时我一直在这里,并且在子查询和连接方面尝试了许多不同的方法。这里有一个确切的问题“获取生活在产品数量最少的城市的客户的名称和城市”
以下是数据库表的快照
我知道如何获得分钟
select min(quantity)
from products
但是这只返回没有附加城市的min,因此我无法在customers表中搜索该城市。
我也试过分组,发现它给了我3分钟(每组城市一个),我相信可以帮助我
select city,min(quantity)
from products
group by city
把所有东西放在一起我得到的东西看起来像
SELECT
c.name,c.city
FROM
customers c
INNER JOIN
(
SELECT
city,
MIN(quantity) AS min_quantity
FROM
products
GROUP BY
city
) AS SQ ON
SQ.city = c.city
但这会返回多个客户,这是不正确的。我假设通过查看数据库城市,当最低数量的产品似乎是纽瓦克并且没有客户居住在纽瓦克,所以我再次假设这个查询会导致0次点击。谢谢你的时间。
实施例 这是一个例子“通过在京都至少为客户订购一个订单的代理商订购产品的pids”
我提供的答案是
select pid
from orders
inner join agents
on orders.aid = agents.aid
inner join customers
on customers.cid = orders.cid
where customers.city = 'Kyoto'
答案 0 :(得分:2)
在Postgresql中,您拥有复杂的工具,即窗口和CTE。
WITH
find_least_sumq AS
(SELECT city, RANK() OVER ( PARTITION BY city ORDER BY SUM(quantity) ) AS r
FROM products)
SELECT name, city
FROM customers NATURAL JOIN find_least_sumq /* ON city */
WHERE r=1; /* rank 1 is smallest summed quantity including ties */
在Drew的answer中,您在任何特定项目的最小数量的城市中都是zeronig。我将这个问题解释为想要在该城市中制作的物品总和。
答案 1 :(得分:1)
我想这是围绕这个想法的:
select customers.name, city.city, city.min
from customers
join (
select city, sum (quantity) as min
from products
group by city
--filter by the cities where the total_quantity = min_quantity
having sum (quantity) = (
--get the minimum quantity
select min(quantity) from products
)
) city on customers.city = city.city
答案 2 :(得分:0)
我刚刚想出了自己的答案。我想休息一下然后回到它就是我所需要的。对于未来的读者,这个答案将使用子查询来帮助您获取列的最小值,并将不同的列(同一行)与不同的表列进行比较。
此示例是在产品表中获取产品数量最少的城市(数量列),并将该城市与城市中的城市列比较,然后打印名称和城市顾客。 (为了帮助澄清,使用原始问题中的链接来查看我正在谈论的数据库的结构)第一步是将所有产品汇总到各自的城市,然后取最小的那个,然后找到那个城市的客户。这是我的解决方案
with citySum as(
select city,sum(quantity) as sum
from products
group by city)
select name,city
from customers
where city
in
(select city
from citySum
where sum =(
select min(sum)
from citySum))
这是我今天发现的另一个解决方案,它只使用子查询
select c.name,c.city
from customers c
where c.city
in
(select city
from
(select p.city,sum(p.quantity) as lowestSum
from products p
group by p.city) summedCityQuantities
order by lowestsum asc
limit 1)
答案 3 :(得分:0)
这可以做得更简单。只需按要获得最小值的字段对输出进行排序。
SELECT city, quantity FROM customers ORDER BY quantity LIMIT 1;