2017-07-16 50 views
0

這裏是我的表:使用GROUPY BY來獲得它的最昂貴的產品的名稱和價格

CREATE TABLE Manufacturers (
    Code   integer PRIMARY KEY, 
    Name   text 
); 
CREATE TABLE Products (
    Code   integer PRIMARY KEY, 
    Name   text, 
    Price   real, 
    Manufacturer integer REFERENCES Manufacturers (Code) 
); 

我想最昂貴的產品的名稱和價格一起選擇每個製造商的名稱。

我嘗試這Postgresql9.6

SELECT A.Name, A.Price, F.Name 
    FROM Products A INNER JOIN Manufacturers F 
    ON A.Manufacturer = F.Code 
    AND A.Price = 
    (
     SELECT MAX(A.Price) 
     FROM Products A 
     WHERE A.Manufacturer = F.Code 
    ); 

它需要像永遠完成它。

那我試試這個:

SELECT Manufacturers.Name AS ManufacturersName, MAX(Price), Products.Name 
    FROM Products, Manufacturers 
    WHERE Products.Manufacturer = Manufacturers.Code 
    GROUP BY Manufacturers.Name; 

我得到了錯誤:

ERROR: column "products.name" must appear in the GROUP BY clause or be used in an aggregate function 
LINE 1: ...ufacturers.Name AS ManufacturersName, MAX(Price), Products.N... 

我知道products.name不應該出現在它,但它是PostgreSQL的約束?

我需要products.name的結果,有人能指點我在正確的方向嗎?

回答

1

以下查詢將爲每個製造商產品提供最昂貴的價格。如果平行,它將返回多個產品。如果您只想每個製造商提供一個產品而不考慮領帶,請將DENSE_RANK替換爲ROW_NUMBER

SELECT 
    t.m_name, 
    t.p_name, 
    t.Price 
FROM 
(
    SELECT 
     t1.Name AS m_name, 
     COALESCE(t2.Name, 'NA') AS p_name, 
     COALESCE(t2.Price, 0.0) AS price, 
     DENSE_RANK() OVER (PARTITION BY t1.Code ORDER BY t2.Price DESC) dr 
    FROM Manufacturers t1 
    LEFT JOIN Products t2 
     ON t1.Code = t2.Manufacturer 
) t 
WHERE t.dr = 1; 
1

您可以使用DISTINCT ON

SELECT DISTINCT ON (m.Name) m.Name AS ManufacturersName, p.Price, p.Name 
FROM Products p JOIN 
    Manufacturers m 
    ON p.Manufacturer = m.Code 
ORDER BY m.Name, p.Price DESC; 

不聚合似乎是必要的。

相關問題