【问题标题】:Oracle - Selecting only the maximum value from a columnOracle - 仅从列中选择最大值
【发布时间】:2018-10-28 18:22:02
【问题描述】:

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

三表:顺序、步骤、材料

“订单”表包含IDmaterial

表“step”包含IDorderstepnumber

“材料”表包含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

我尝试将MAXfunction 放到step.stepnumber 中,但没有任何效果。

【问题讨论】:

    标签: sql database oracle join select


    【解决方案1】:

    你可以尝试使用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 中的关键字。

    【讨论】:

    • 我收到错误 ORA-00923: FROM keyword not found where expected
    • @Ponzaro 因为您的列中的关键字太多,您可以试试我的 sqlfiddle。
    • 我看到你的 SQLFiddle 工作没有问题,但对我来说它不起作用 :( 现在它显示错误 ORA-00904 invalid identifier for all identifiers in the main select
    • 尝试在from 中添加db. 计算您的桌子
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多