如何根据条件

时间:2016-03-23 18:12:33

标签: sql db2 aggregate-functions

考虑这个玩具示例,我有一个非常简单的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。

顺便说一句,这是一个高度简化的例子,在我的实际查询中,我已经离开了连接来创建更大的集合,如果这很重要

2 个答案:

答案 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()