这个问题在这里已有答案:
Item Number | Customer | Creation Date | Onhand Qty
123 1 03-FEB-19 654
234 3 03-FEB-19 987
789 5 03-FEB-19 874
321 4 03-FEB-19 147
567 7 03-FEB-19 632
123 1 29-JAN-19 547
234 3 29-JAN-19 814
789 5 29-JAN-19 458
321 4 29-JAN-19 330
567 7 29-JAN-19 118
我上面有这个数据集,但对于成千上万的项目和数百个客户。
我想做的是返回最新的'Onhand Qty'字段,所以max(creation_date)但是按项目和客户。
Item Number | Customer | Creation Date | Onhand Qty
123 1 03-FEB-19 654
234 3 03-FEB-19 987
789 5 03-FEB-19 874
321 4 03-FEB-19 147
567 7 03-FEB-19 632
实际上,我正在尝试根据客户和项目找到最近的有效数量,所以我可以说在最近的检查中,'客户1有654单位的项目123'。
有人能帮助我吗?
这是在Oracle数据库(V11)中。
非常感谢
使用ROW_NUMBER()
如下:
SELECT * FROM (
SELECT t.*, ROW_NUMBER() OVER(PARTITION BY Customer, Item_Number ORDER BY creation_date DESC) rn
FROM mytable t
) WHERE rn = 1
在子查询中,ROW_NUMBER()
为具有相同Customer / Item的记录组中的每条记录分配序列号。序列按降序创建日期排序(因此最高日期首先出现)。然后,外部查询过滤每个组中的第一个记录。
这个带有样本数据的DB Fiddle demo返回:
ITEM_NUMBER | CUSTOMER | CREATION_DATE | ONHAND_QTY | RN ----------: | -------: | :------------ | ---------: | -: 123 | 1 | 29-JAN-19 | 547 | 1 234 | 3 | 29-JAN-19 | 814 | 1 321 | 4 | 29-JAN-19 | 330 | 1 789 | 5 | 29-JAN-19 | 458 | 1 567 | 7 | 29-JAN-19 | 118 | 1
使用row_number()
select * from (select *,row_number() over(partition by Customer order by creation_date desc,qty desc) rn from table
) t where t.rn=1
您可以尝试使用row_number()并在over子句中添加partition by Customer,item order by creation_date desc
select * from
(
select *,row_number() over(partition by Customer,item order by creation_date desc) rn from table
)A where rn=1