2015-08-21 60 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