【发布时间】:2018-09-01 08:00:29
【问题描述】:
我正在尝试使用 MAX() OVER PARTITION BY 函数来评估我公司购买的特定部件的最新收据。以下是去年几个部分的信息示例表:
| VEND_NUM | VEND_NAME | RECEIPT_NUM | RECEIPT_ITEM | RECEIPT_DATE |
|----------|--------------|-------------|----------|--------------|
| 100 | SmallTech | 2001 | 5844HAJ | 11/22/2017 |
| 100 | SmallTech | 3188 | 5521LRO | 12/31/2017 |
| 200 | RealSolution | 5109 | 8715JUI | 05/01/2017 |
| 100 | SmallTech | 3232 | 8715JUI | 11/01/2017 |
| 200 | RealSolution | 2101 | 4715TEN | 01/01/2017 |
如您所见,第三行和第四行显示了相同部件号的两个不同供应商。
这是我当前的查询:
WITH
-- various other subqueries above...
AllData AS
(
SELECT VEND_NUM, VEND_NAME, RECEIPT_NUM, RECEIPT_ITEM, RECEIPT_DATE
FROM tblVend
INNER JOIN tblReceipt ON VEND_NUM = RECEIPT_VEND_NUM
WHERE
VEND_NUM = '100' OR VEND_NUM = '200' AND RECEIPT_DATE >= '01-Jan-2017'
),
SELECT MAX(RECEIPT_DATE) OVER PARTITION BY(RECEIPT_ITEM) AS "Recent Date", RECEIPT_ITEM
FROM AllData
我的返回集如下所示:
| Recent Date | RECEIPT_ITEM |
|-------------|--------------|
| 11/22/2017 | 5844HAJ |
| 12/31/2017 | 5521LRO |
| 11/01/2017 | 8715JUI |
| 11/01/2017 | 8715JUI |
| 01/01/2017 | 4715TEN |
但是,它应该是这样的:
| Recent Date | RECEIPT_ITEM |
|-------------|--------------|
| 11/22/2017 | 5844HAJ |
| 12/31/2017 | 5521LRO |
| 11/01/2017 | 8715JUI |
| 01/01/2017 | 4715TEN |
任何人都可以就我做错了什么提供建议吗?看起来它只是在替换最近的日期,而不是只给我想要的最近的行。
最终,我希望我的桌子看起来像这样。但是,我不知道如何正确使用 MAX() 或 MAX() OVER PARTITION BY() 函数来实现这一点:
| VEND_NUM | VEND_NAME | RECEIPT_NUM | RECEIPT_ITEM | RECEIPT_DATE |
|----------|--------------|-------------|----------|--------------|
| 100 | SmallTech | 2001 | 5844HAJ | 11/22/2017 |
| 100 | SmallTech | 3188 | 5521LRO | 12/31/2017 |
| 100 | SmallTech | 3232 | 8715JUI | 11/01/2017 |
| 200 | RealSolution | 2101 | 4715TEN | 01/01/2017 |
【问题讨论】:
-
可能使用
partition by trim(receipt_item).. 该列中可能有一个额外的空格。 -
嗨@VamsiPrabhala,非常感谢您的建议。不幸的是,同样的事情......我不知道为什么我的 MAX() 不起作用。
-
听起来您想过滤除每个部分的最新收据之外的所有内容?如果是这样,
max()不一定是这样做的方法。 -
@WilliamRobertson 纠正威廉,抱歉措辞不佳。我一直在研究如何解决这个问题,我错误地认为 max 是我最好的方法。
标签: sql oracle window-functions