首页 > 解决方案 > 修改查询(显示每个项目的最新行)

问题描述

我正在尝试获取每个项目的最新行(每个项目的最新行用行内的 request_id 标识)

这些是我的表:

create table table_price_product 
(
    LIST_HEADER_ID int, 
    LIST_LINE_ID int,   
    ITEM_CODE int,  
    PRICE VARCHAR(32),  
    START_DATE_ACTIVE varchar(32),  
    END_DATE_ACTIVE varchar(32),    
    INSERT_UPDATE_FLAG varchar(5),  
    REQUEST_ID int, 
    LAST_UPDATE_DATE varchar(32)
);

create table table_price_list 
(
    LIST_HEADER_ID int, 
    NAME varchar(32),   
    CURRENCY_CODE varchar (32),
    REQUEST_ID int
);

这是我的SQLFIDDLE

这是我的查询,但我没有得到我想要的:

SELECT man.LIST_HEADER_ID number,
       man.ITEM_CODE item_code,
       man.PRICE,
       man.START_DATE_ACTIVE,
       man.END_DATE_ACTIVE,
       man.REQUEST_ID
FROM table_price_product man,
     table_price_list pal
WHERE man.LIST_HEADER_ID = pal.LIST_HEADER_ID
  AND (man.START_DATE_ACTIVE IS NULL
OR man.END_DATE_ACTIVE IS NULL)
AND man.REQUEST_ID = pal.REQUEST_ID
ORDER BY man.LAST_UPDATE_DATE ASC;

这是我的查询显示的内容:

> CODE  |SKU     |PRICE  |START_DATE_ACTIVE|END_DATE_ACTIVE|REQUEST_ID
> 655234|99342435|9999   |       null      |null           |42937536
> 655234|99342435|8888   |       null      |null           |42937507
> 655234|99342435|7445   |       null      |null           |42937506
> 655234|99342435|5545   |       null      |null           |42937505
> 655234|99342435|2254   |       null      |null           |42937504
> 655234|89992424|18799  |       null      |null           |72254787
> 655234|89992424|18444  |       null      |null           |72254780
> 655234|89992424|18005  |       null      |null           |72254781
> 655234|89992424|18045  |       null      |null           |72254782
> 655234|91123323|1049   |       null      |null           |88755875
> 655234|91123323|1000   |       null      |null           |88755865
> 655234|91123323|9878   |       null      |null           |88755862
> 655234|91123323|10498  |       null      |null           |88755861
> 655234|91123323|1044   |       null      |null           |88755860

但我想获得这个输出(每个项目的最高 request_id):

CODE  |SKU     |PRICE  |START_DATE_ACTIVE|END_DATE_ACTIVE|REQUEST_ID
655234|99342435|9999   |       null      |null           |42937536
465408|89992424|18799  |       null      |null           |72254787
464062|91123323|1049   |       null      |null           |88755875

我试图通过在分区内使用over来解决这个问题,但它对我不起作用

可以帮我?

编辑:我正在使用 Oracle 数据库

标签: sqloracle

解决方案


使用窗口函数尝试以下操作row_number,此外,您应该始终使用显式连接。

SELECT 
  man.LIST_HEADER_ID number,
  man.ITEM_CODE item_code,
  man.PRICE,
  man.START_DATE_ACTIVE,
  man.END_DATE_ACTIVE,
  man.REQUEST_ID
from
(
  SELECT 
    man.LIST_HEADER_ID number,
    man.ITEM_CODE item_code,
    man.PRICE,
    man.START_DATE_ACTIVE,
    man.END_DATE_ACTIVE,
    man.REQUEST_ID,
    row_number() over (partition by SKU order by request_id desc) as rnk
  FROM table_price_product man
  join table_price_list pal
  ON man.LIST_HEADER_ID = pal.LIST_HEADER_ID
  AND man.REQUEST_ID = pal.REQUEST_ID
  where (man.START_DATE_ACTIVE IS NULL
  OR man.END_DATE_ACTIVE IS NULL)
) val
where rnk = 1

推荐阅读