首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:如何获取最小数量?

SQL:如何获取最小数量?
EN

Stack Overflow用户
提问于 2014-10-19 09:40:46
回答 2查看 633关注 0票数 0

我有这个问题。当我试图总结各国产品的最低质量时,它并没有奏效。我在产品下面有两张表:

代码语言:javascript
复制
ID|NAME |NaID|Qty
-------------------
01|Fruit|JP  |50
02|MEAT |AUS |10
03|MANGA|JP  |80
04|BOOK |AUS |8

国家:

代码语言:javascript
复制
NaID |NAME 
-------------------
AUS  |Australia 
JP   |Japan      

我想要这样的结果:

代码语言:javascript
复制
ID|NAME |Name|minQty
-------------------
01|Fruit|JP  |50     
04|BOOK |AUS |8

我用:

代码语言:javascript
复制
select p.id,p.name, p.NaID,n.name,min(P.Qty)as minQty
from Product p,Nation n
where p.NaID=n.NaID
group by p.id,p.name, p.NaID,n.name,p.Qty

我得到了这个(T_T):

代码语言:javascript
复制
ID|NAME |NaID|minQty
-------------------
01|Fruit|JP  |50
02|MEAT |AUS |10
03|MANGA|JP  |80
04|BOOK |AUS |8

拜托,有人能帮我吗?我认为我现在在SQL方面很差。

EN

回答 2

Stack Overflow用户

发布于 2014-10-19 09:57:20

在Oracle中,您可以使用几种技术。您可以使用子查询和分析函数,但最有效的方法是使用聚合函数最小第一

你的桌子:

代码语言:javascript
复制
SQL> create table nation (naid,name)
  2  as
  3  select 'AUS', 'Australia' from dual union all
  4  select 'JP', 'Japan' from dual
  5  /

Table created.

SQL> create table product (id,name,naid,qty)
  2  as
  3  select '01', 'Fruit', 'JP', 50 from dual union all
  4  select '02', 'MEAT', 'AUS', 10 from dual union all
  5  select '03', 'MANGA', 'JP', 80 from dual union all
  6  select '04', 'BOOK', 'AUS', 8 from dual
  7  /

Table created.

查询:

代码语言:javascript
复制
SQL> select max(p.id) keep (dense_rank first order by p.qty) id
  2       , max(p.name) keep (dense_rank first order by p.qty) name
  3       , p.naid "NaID"
  4       , n.name "Nation"
  5       , min(p.qty) "minQty"
  6    from product p
  7         inner join nation n on (p.naid = n.naid)
  8   group by p.naid
  9       , n.name
 10  /

ID NAME  NaID Nation        minQty
-- ----- ---- --------- ----------
01 Fruit JP   Japan             50
04 BOOK  AUS  Australia          8

2 rows selected.

由于您没有使用Oracle,这是一个效率较低的查询,但可能在所有RDBMS中都使用:

代码语言:javascript
复制
SQL> select p.id
  2       , p.name
  3       , p.naid
  4       , n.name
  5       , p.qty
  6    from product p
  7         inner join nation n on (p.naid = n.naid)
  8   where ( p.naid, p.qty )
  9         in
 10         ( select p2.naid
 11                , min(p2.qty)
 12             from product p2
 13            group by p2.naid
 14         )
 15  /

ID NAME  NAID NAME             QTY
-- ----- ---- --------- ----------
01 Fruit JP   Japan             50
04 BOOK  AUS  Australia          8

2 rows selected.

注意,如果每个国家有几行具有相同的最小数量,那么所有这些行都将被返回,而不是像以前的"Oracle"-query中那样返回一个行。

票数 0
EN

Stack Overflow用户

发布于 2014-10-19 14:06:18

代码语言:javascript
复制
with cte as (
   select *,
      row_number() over (partition by Nation order by qty) as [rn]
   from product
)
select * from cte where [rn] = 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26449233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档