2010-09-26 69 views
2

SQL組問題按問題組

我有一個問題的SQL組。我的表格有以下形式。

Cust_id.  Price_id     Price. 
---------------------------- 
1.          556.        5000. 
----------------------------- 
2.          654.        600. 
2.          432.         487. 
2.          546.         500. 
--------------------------- 
3.          455.         200. 
3.          877.         143. 
3.          123.         879. 

現在,當我運行此查詢:

Select  cust_id,  max(price) as max, min(price) as min. 
From table. 
Group by cust_id. 

我得到。

Cust_id.     Max.        Min. 
1.           5000.       5000. 
2.           600.        487. 
3.           879.        143. 

但我真正想要的不是最大和最小价格,而是與價格相關的price_id。
所以結果是。

Cust_id.     Max.       Min. 
1.             556.        556. 
2.             654.        432. 
3.             123.        877.   

我不知道該怎麼做。我認爲上面的查詢將是某種子查詢,但是就我而言。

+0

什麼數據庫引擎? – Lucero 2010-09-26 21:54:04

+1

你正在使用哪個數據庫? (SQL Server,MySQL,PostGRES,...) – Andomar 2010-09-26 21:54:24

+1

@dlb - 不知道爲什麼你恢復了我的修改...但有一個看起來醜陋的問題不會幫助獲得答案... – 2010-09-26 21:56:08

回答

4

用途:

SELECT x.cust_id, 
      y.price_id AS max, 
      z.price_id AS min 
    FROM (SELECT t.cust_id, 
        MAX(t.price) as max, 
        MIN(t.price) as min 
      FROM TABLE t 
     GROUP BY t.cust_id) x 
LEFT JOIN TABLE y ON y.cust_id = x.cust_id 
       AND y.price = x.max 
LEFT JOIN TABLE z ON z.cust_id = x.cust_id 
       AND z.price = x.min 

的問題是,如果一個cust_id有兩個記錄具有相同高(或低)的價格,你會看到重複的,需要提供邏輯來處理的關係。

+0

cuts_id vs cust_id?這個問題是困惑的... – 2010-09-26 21:57:52

+0

@Jonathan Leffler:我用OP提供的查詢來構建它。 – 2010-09-26 22:00:14

+0

需要調整--OP需要最大/最小价格price_ids,而不是價格。 – 2010-09-26 22:03:37

0

這應該與排名/解析函數引擎做的伎倆:

SELECT Pmin.Cust_id, Pmax.Price_id Price_max_id, Pmin.Price_id Price_min_id FROM 
(SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.Cust_id ORDER BY t.Price DESC) ix FROM @table t) Pmin 
JOIN (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.Cust_id ORDER BY t.Price ASC) ix FROM @table t) Pmax 
    ON Pmin.Cust_id = Pmax.Cust_id 
WHERE (Pmin.ix = 1) AND (Pmax.ix = 1) 
+0

使用RANK可以返回重複項; ROW_NUMBER會確保不會返回重複項。 – 2010-09-26 22:06:52

+0

是的,在我看到您的評論之前已經解決了這個問題。不過謝謝。 – Lucero 2010-09-26 22:08:01

0

這是經典的問題,即誰使用MySQL大多數人有GROUP BY。 MySQL允許在標準SQL和其他大多數品牌的數據庫中不允許的查詢。

您需要的是整行,包括您正在分組的cust_id以外的列,以便該行在該組中具有最高(或最低)的價格。您無法從GROUP BY獲取該信息。

我真正想要的是... price_id與價格相關聯。

但是,您需要哪種price_id,最高價格的行,還是最低價格的行?這些可以是不同的行。

Cust_id. Price_id  Price 
---------------------------- 
2.   654   600 <-- max price, price_id 654 
2.   432   487 <-- min price, price_id 432 
2.   546   500 

如果多行具有相同的價格,但price_id的不同?它應該返回654還是546?

Cust_id. Price_id  Price 
---------------------------- 
2.   654   600 <-- max price, price_id 654 
2.   432   487 
2.   546   600 <-- max price, price_id 546 

相反,如果你想要的最大值和最小值的價格,你想要什麼的price_id兩行:行,使得沒有其他行具有相同的cust_id和較高的性價比,行,從而存在沒有其他行存在相同的cust_id和較低的價格。

SELECT tmax.cust_id, tmax.price_id, tmax.price, tmin.price_id, tmin.price 
FROM table tmax 
JOIN table tmin ON tmax.cust_id = tmin.cust_id 
WHERE NOT EXISTS (SELECT * FROM table t1 WHERE t1.cust_id = tmax.cust_id AND t1.price > tmax.price) 
    AND NOT EXISTS (SELECT * FROM table t2 WHERE t2.cust_id = tmin.cust_id AND t2.price > tmin.price) 
0

這裏有一個SQL Server的方法是您使用

with Data as 
(
    select 1 Cust_id, 556 Price_id, 5000 Price union ALL 
    select 2,   654,   600 union ALL 
    select 2,   432,   487 union ALL 
    select 2,   546,   500 union ALL 
    select 3,   455,   200 union ALL 
    select 3,   877,   143 union ALL 
    select 3,   123,   879 
), 
Prices as 
(
    select Cust_id, MAX(Price) MaxP, MIN(Price) MinP 
    from Data 
    group by Cust_id 
) 
select Prices.Cust_id 
     ,Data.Price MaxPrice 
     , d2.Price MinPrice 
from Prices 
inner join Data on Data.Cust_id = Prices.Cust_id and Data.Price = Prices.MaxP 
inner join Data d2 on d2.Cust_id = d2.Cust_id and d2.Price = Prices.MinP 
+0

這也有重複的問題。 – Lucero 2010-09-26 22:09:47