PostgreSQL:获取与其关联城市的列的最小值

时间:2014-02-20 04:02:13

标签: sql postgresql

过去两个小时我一直在这里,并且在子查询和连接方面尝试了许多不同的方法。这里有一个确切的问题“获取生活在产品数量最少的城市的客户的名称和城市”

以下是数据库表的快照

我知道如何获得分钟

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'

4 个答案:

答案 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;