我的数据库的结构大致是这样的(简化):
三张表:订单、步骤、 Material
“订单”表包含列 ID
和 material
表“step”包含列ID
、order
和stepnumber
“material”表包含列ID
和description
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 |
注意
我们可能会尽量避免使用Order
,Number
是列名或表名...因为它们是Oracle 中的关键字。
关于sql - Oracle - 仅从列中选择最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034740/