2015-08-21 94 views
0

此問題是this較早問題(未由我提問)的擴展。如何GROUP和選擇SQL和相關列中的最低值

我有包括這些字段的表:

id | date_from | date_to  | price | priceName 
-------------------------------------------------------- 
CK1  22-12-2012 29-12-2012  800  low 
CK1  22-12-2012 29-12-2012  1200  medium 
CK2  22-12-2012 29-12-2012  1400  high 
CK2  22-12-2012 29-12-2012  1800  very high 
CK2  22-12-2012 29-12-2012  2200  extortionate 

如何創建一個SQL選擇組的結果通過ID,DATE_FROM,DATE_TO從價格挑選的最低值,並且是priceName關聯最低價格

那麼結果將是

CK1  22-12-2012 29-12-2012  800  low 
CK2  22-12-2012 29-12-2012  1400 high 

從以前的問題,我可以這樣做:

select id, date_from, date_to, min(price) 
from table 
group by id, date_from, date_to 

如何擴展這個只能選擇將最低(價格)相匹配的priceName?按priceName分組將不起作用,因爲它不限制爲min(價格)。

+0

請問您的表有某種ROW_ID主鍵或者是複合鍵(id,date_from,DATE_TO,價格)?您可以將您的查詢包裝在CTE中,並根據主要查詢中的密鑰丟失praceName。 'WITH cte AS(SELECT uniqueId,...)SELECT * FROM table_name t JOIN cte c ON t.uniqueId = c.uniqueId' – lad2025

+0

它是一個複合關鍵字:id,date_from,date_to(不是價格)。 – Polyfun

回答

1

您可以使用子查詢。

Select Table.id,Date_from,date_to,MinPrice,PriceName 
from 
    (select id, min(price) as MinPrice 
    from table 
    group by id) t1 
INNER JOIN table ON t1.id=table.id and t1.MinPrice=table.Price 
Group by id,Date_from,date_to,MinPrice,PriceName 
+0

謝謝,這似乎是最簡單的答案之一,它適用於我。 – Polyfun

0

的一種方法是使用rank窗函數:

SELECT id, date_from, date_to, price, priceName 
FROM (SELECT id, date_from, date_to, price, priceName, 
       RANK() OVER (PARTITION BY id, date_from, date_to 
          ORDER BY price ASC) AS rk 
     FROM mytable) t 
WHERE rk = 1 
0

試試這個:

Select t.*,t1.priceName from (
select id, date_from, date_to, min(price) 
from table 
group by id, date_from, date_to) t 
join table t1 on t.id =t1.id 
and t.date_from =t1.date_from 
and t.date_to =t1.date_to 
and t.price =t1.price 
0

使用CTE:

WITH cte (id, date_from, date_to, minprice) AS (
    SELECT id, date_from, date_to, [minprice] = min(price) 
    FROM table_name 
    GROUP BY id, date_from, date_to) 
SELECT 
    c.id, c.date_from, c.date_to, c.[minprice], t.priceName 
FROM table_name t 
JOIN cte c 
ON t.id = c.id 
    AND t.date_from = c.date_to 
    AND t.data_to = c.date_to