考虑这个玩具示例,我有一个非常简单的SQL表,其中包含一些partnumbers,价格和货币。我想找到每件商品的最低价格。
她是表PRICELIST
PartNumber Price Currency
1 19 USD
1 10 CAD
1 18 GBP
2 15 USD
2 14 CAD
2 8 GBP
3 5 USD
3 1 CAD
3 11 GBP
我想用货币显示最低价格。这是我想要的输出:
PartNumber Price Currency
1 10 CAD
2 8 GBP
3 1 CAD
如果我说select partnumber, min(price) from pricelist group by partnumber
查询将执行,但如果我指定货币:
select partnumber, min(price),currency from pricelist group by partnumber
然后我收到一个错误说:
在SELECT子句,HAVING子句或ORDER BY子句中指定的以“CURRENCY”开头的表达式未在GROUP BY子句中指定,或者在具有列函数的SELECT子句,HAVING子句或ORDER BY子句中指定并且没有指定GROUP BY子句..
我想显示价格最低的行的货币值。我该怎么办?
数据库是DB2。
顺便说一句,这是一个高度简化的例子,在我的实际查询中,我已经离开了连接来创建更大的集合,如果这很重要
答案 0 :(得分:1)
您必须加入到原始表格才能获得其余字段:
select t1.partnumber, t1.price, t1.Currency
from pricelist as t1
join (
select partnumber, min(price) as price
from pricelist
group by partnumber
) as t2 on t1.partnumber = t2.partnumber and t1.price = t2.price
或者,您可以使用ROW_NUMBER
:
select partnumber, price, Currency
from (
select partnumber, price, Currency,
row_number() over (partition by partnumber
order by price) as rn
from pricelist ) as t
where t.rn = 1
注意:第一种方法可能会选择多于partnumber
的记录(如果是关系),而第二种方法总是按partnumber
选择一条记录。
答案 1 :(得分:1)
只需使用row_number()
:
select pl.*
from (select pl.*,
row_number() over (partition by partnumber order by price) as seqnum
from pricelist
) pl
where seqnum = 1;
如果存在最低价格的关系,则选择任意一个。对于所有这些,请使用rank()
或dense_rank()
代替row_number()
。