2014-02-20 58 views
0

我一直在過去的兩個小時,並已嘗試過許多不同的方式來處理子查詢和連接。這裏是確切的問題「獲取誰住在這裏的產品數量最少的是使這個城市的名稱和客戶之城」PostgreSQL:獲取與其相關城市的列的最小值

這裏是數據庫表的快照

我知道如何得到最小

select min(quantity) 
from products 

但這隻返回沒有附加城市的分鐘,所以我不能搜索客戶表中的城市。

我也被嘗試過組,發現它給了我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點。感謝您的時間。

例 下面是一個例子「獲得通過誰使至少一個爲了在京都一個客戶的任何代理人訂購的產品的PID」

,我所提供的答案是

select pid 
    from orders 
    inner join agents 
    on orders.aid = agents.aid 
    inner join customers 
    on customers.cid = orders.cid 
    where customers.city = 'Kyoto' 
+1

你能提供一些樣品數據和想要的結果嗎?換句話說,你希望你的查詢做什麼? –

+0

嗨,戈登我在底部爲你添加了一個例子。我希望這個查詢能夠獲得生產最少產品的城市的客戶的姓名和城市。我假設這個問題正在討論產品表中的數量列。另外看看我提供的鏈接中的數據庫表格佈局。它將清除所有內容 –

+2

在http://sqlfiddle.com/上提供示例數據而不是圖片會很好。 – vyegorov

回答

0

我剛剛想出了我自己的答案。我想休息一下,然後回到這是我所需要的。對於將來的讀者,這個答案將使用子查詢來幫助您獲取列的最小值,並將不同列(同一行的列)與不同的表列進行比較。

本示例獲取產品表中產品數量最少(數量欄)的城市,並將該城市與城市列表中的客戶表中的城市列進行比較,然後將城市的名稱和城市那些客戶。 (以幫助澄清,使用原始問題中的鏈接來查看我所談論的數據庫的結構)第一步是將所有產品彙總到它們各自的城市,然後取其中的最小值,然後找到客戶在city.Here是我的解決方案

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) 
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 
+0

嘿,剛想出解決方案,我自己的問題。儘管我確實嘗試了你的方法,但它似乎奏效,但我無法確定。我試着測試它來找到最大數量,以便我可以看到輸出結果,並確認它是正確的,但是無法正常工作。在我自己的解決方案中,我能夠對其進行測試並以保密方式說明該解決方案是正確的。 –

0

這可以做了這麼多簡單。只需按照您希望獲得最小值的字段對輸出進行排序。

SELECT city, quantity FROM customers ORDER BY quantity LIMIT 1; 
+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 */ 

在德魯的answer,你是在哪裏由任何特定項目的最小數量的城市zeronig英寸我把這個問題解釋爲想要在這個城市做出的項目總和。

+0

您絕對正確事實上城市必須首先總結出來,因爲有多個同名的城市。然後分組,然後從中分出。我當時不明白這一點,所以感謝大家明白這一點。我相信你的答案是足夠的,我也做了這個(見我編輯的答案),我相信這也是正確的。謝謝你的時間,我將去了解什麼分區,結束和自然加入! –

+0

'NATURAL JOIN'只是具有相同名稱的列上的'JOIN'的快捷方式。你可以沒有它,以更多打字爲代價。開窗功能是自切片面包以來最好的事情之一(嗯,使用美國短語可能不是這樣最好的網站)。他們讓你可以針對某些類型的問題編寫較短的查詢,這可能會運行得更好。 http://www.postgresql.org/docs/9.1/static/tutorial-window.html –

相關問題