sql - 修改查询(显示每个项目的最新行)
问题描述
我正在尝试获取每个项目的最新行(每个项目的最新行用行内的 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 数据库
解决方案
使用窗口函数尝试以下操作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
推荐阅读
- s4hana - 操作员工作时间和生产订单之间的 SAP 链接
- python - requests.get() 没有输出
- c++ - 返回指向使用 new 创建的数组数组的指针
- node.js - 术语“New-AzureServiceProject”未被识别为 cmdlet 的名称
- javascript - 如何防止选定的长字符串值在反应选择控件中被截断?
- git - 每个 git 标签都有关联的提交 ID 吗?
- amazon-redshift - 在 Redshift 上使用百分位数计算中位数
- r - 根据组属性过滤组中的行
- java - 在java中动态定义集合或对象类型变量
- beautifulsoup - BS4 Beautiful Soup 从 find_all 中提取文本