sql - Oracle - 仅从列中选择最大值

标签 sql database oracle join select

我的数据库的结构大致是这样的(简化):

三张表:订单、步骤、 Material

“订单”表包含列 IDmaterial

表“step”包含列IDorderstepnumber

“material”表包含列IDdescription

            Order                         
    --------------------------------    
     **ID** **Number**     **Material**    
       1         X1            11
       2         X2            12
       3         X3            13


              Step
   ---------------------------------------
   **ID**    **Order**  **Stepnumber***
     1          X1           X110
     2          X1           X120
     3          X1           X170
     4          X1           X180
     5          X2           X270
     6          X2           X280

                 Material
   ---------------------------------------
  **ID**      **Description***
    11             Mat1
    12             Mat2
    13             Mat3

需要注意的是,表的 stepnumber 列由订单号(例如 X1)和标识步骤的数字(10、20、70、80 等)组成.),如您所见,stepnumber 列中有多个值指向同一订单。

我正在使用这个查询:

select order.number,step.stepnumber, material.id,material.description, 
from db.order inner join db.stepnumber
on order.number = step.order
inner join db.material
on material.id = order.material
where step.stepnumber not like '%10'
and step.stepnumber not like '%20'
group by order.number, step.stepnumber, material.id, material.description

正如您从查询中看到的,我想提取订单和步骤数据,并且我根据 stepnumber 值排除了一些步骤。

现在,查询输出是:

order.number step.stepnumber material.id material.description 
-------------------------------------------------------------
  X1             X170             11           Mat1
  X1             X180             11           Mat1
  X2             X270             12           Mat2
  X2             X280             12           Mat2

我想实现的是,对于每个订单,只提取一行,取 stepnumber 值较高的那一行。所以结果应该是:

order.number step.stepnumber material.id material.description 
-------------------------------------------------------------
  X1             X180             11           Mat1
  X2             X280             12           Mat2

我已经尝试将 MAX 函数放入选择中的 step.stepnumber 但没有效果。

最佳答案

你可以尝试使用ROW_NUMBER窗口函数

CREATE TABLE "Order"(
   ID int,
   "Number" varchar(50),
   Material int
);


INSERT INTO  "Order" VALUES (1,'X1',11);
INSERT INTO  "Order" VALUES (2,'X2',12);
INSERT INTO  "Order" VALUES (3,'X3',13);

CREATE TABLE Step(
   ID int,
   "Order" varchar(50),
   Stepnumber varchar(50)
);


insert into Step values (1,'X1','X110');
insert into Step values (2,'X1','X120');
insert into Step values (3,'X1','X170');
insert into Step values (4,'X1','X180');
insert into Step values (5,'X2','X270');
insert into Step values (6,'X2','X280');

CREATE TABLE Material(
   ID int,
   Description varchar(50)
);               


INSERT INTO Material VALUES (11,'Mat1');
INSERT INTO Material VALUES (12,'Mat2');
INSERT INTO Material VALUES (13,'Mat3');

查询 1:

SELECT "Number",STEPNUMBER,ID,DESCRIPTION 
FROM (
  select o."Number",
           s.stepnumber, 
           m.id,
           m.description,
           ROW_NUMBER() OVER(PARTITION BY o."Number" ORDER BY s.stepnumber DESC) rn
    from db."Order" o
    inner join db.Step s on o."Number" = s."Order"
    inner join db.material m on m.id = o.material
    where 
        s.stepnumber not like '%10'
    and 
        s.stepnumber not like '%20'
) t1
WHERE rn = 1

Results :

| Number | STEPNUMBER | ID | DESCRIPTION |
|--------|------------|----|-------------|
|     X1 |       X180 | 11 |        Mat1 |
|     X2 |       X280 | 12 |        Mat2 |

注意

我们可能会尽量避免使用OrderNumber 是列名或表名...因为它们是Oracle 中的关键字。

关于sql - Oracle - 仅从列中选择最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034740/

相关文章:

mysql - 用于提取仅链接到已关闭缺陷的测试用例的 QC 查询

database - 什么时候应该使用一对一关系?

sql - 使用 Shell 脚本和 SQL 查询的结果生成属性文件

oracle - 在命令行参数之间添加逗号

sql - 将表中的多行分组到列中

mysql - 将 3589 格式化为 00 :35:89 using SQL SELECT Sum

c# - 通过 SqlBulkCopy 导入 Excel 文件时出现不同的错误

mysql - 从按字段分组的表中选择并使用 Django ORM 选择最大日期时间

mysql - 如何删除名称中包含字符 '?' 的数据库?

database - 基于RDF的异构关系数据库集成是如何工作的?