【问题标题】:DB2 Query to get Latest DataDB2 查询以获取最新数据
【发布时间】:2018-04-16 19:03:52
【问题描述】:

我需要通过每个唯一的 Sup_Num 和 CONTAINER_CODE 组合查询 DB2 表以获取表中存储的最新数据。我遇到的问题是我无法弄清楚如何只获取最新日期(INSERTED_DT)的数据。我尝试在 INSERTED_DT 字段上使用 Max() 函数,但它给了我在不使用 Max() 函数时得到的完全相同的结果。当我搜索 Max() 函数使用示例时,我没有看到类似的东西,所以我希望这里有人能提供帮助。

我使用的查询是这样的:

Select Distinct
    SupLookup.SUPPLIER_NO concat SupLookup.SUPPLIER_LOCATION AS Sup_Num,
    SupLookup.CONTAINER_CODE,
    AllocationType.ALLOC_TYPE_DESC,
    Allocation.ALLOC_QTY,
    Allocation.SAFE_STOCK_QTY,
    Allocation.ALLOC_QTY + Allocation.SAFE_STOCK_QTY AS CALC_TOT_ALLOC_REQ_QTY,
    SupLookup.ALLOC_REQ_QTY,
    SupLookup.TOT_ALLOC_REQ_QTY,
    SupLookup.DISC_QTY,
    SupLookup.FILL_PERCENT,
    MAX(SupLookup.INSERTED_DT) as Insert_DT

From RCX.RXSAL1 Allocation
    Inner Join rcx.RXALT1 AllocationType on Allocation.ALLOC_TYPE_ID = AllocationType.ALLOC_TYPE_ID
    Left Join rcx.RXPIR1 SupLookup on Allocation.SUPPLIER_ID = SupLookup.SUPPLIER_ID And allocation.CONTAINER_TYPE_ID = SupLookup.CONTAINER_TYPE_ID

Where Allocation.PLANT_ID= '50000036'

Group by 
    SupLookup.SUPPLIER_NO concat SupLookup.SUPPLIER_LOCATION,
    SupLookup.CONTAINER_CODE,
    AllocationType.ALLOC_TYPE_DESC,
    Allocation.ALLOC_QTY,
    Allocation.SAFE_STOCK_QTY,
    Allocation.ALLOC_QTY + Allocation.SAFE_STOCK_QTY,
    SupLookup.ALLOC_REQ_QTY,
    SupLookup.TOT_ALLOC_REQ_QTY,
    SupLookup.DISC_QTY,
    SupLookup.FILL_PERCENT

ORDER BY Sup_Num ASC

我得到的是这样的:

但我想要的是它只为 Sup_Num 和 Container_Code 的每个组合选择最近的日期,如下所示:

-编辑-

简单的 max/group by 子查询 here 在这种情况下失败(服务器超时)。有人曾建议过,但后来删除了该帖子。

【问题讨论】:

标签: sql group-by db2 max


【解决方案1】:

您的查询不起作用,因为 FILL_PERCENT 的唯一性更低,为每一行组成一个单独的组。 除了 scaisEdge 提到的子查询,您还可以使用 ROW_UMBER 函数 - 按 INSERTED_DT 降序排列,并且只检索每个 SupLookup.SUPPLIER_NO、SupLookup.CONTAINER_CODE 组合的第一行。

看起来像这样:

with temp as (
    Select 
        SupLookup.SUPPLIER_NO concat SupLookup.SUPPLIER_LOCATION AS Sup_Num,
        SupLookup.CONTAINER_CODE,
        AllocationType.ALLOC_TYPE_DESC,
        Allocation.ALLOC_QTY,
        Allocation.SAFE_STOCK_QTY,
        Allocation.ALLOC_QTY + Allocation.SAFE_STOCK_QTY AS CALC_TOT_ALLOC_REQ_QTY,
        SupLookup.ALLOC_REQ_QTY,
        SupLookup.TOT_ALLOC_REQ_QTY,
        SupLookup.DISC_QTY,
        SupLookup.FILL_PERCENT,
        SupLookup.INSERTED_DT,
        row_number() over (partition by SupLookup.SUPPLIER_NO, SupLookup.CONTAINER_CODE order by SupLookup.INSERTED_DT desc) as rownum

    From RCX.RXSAL1 Allocation
        Inner Join rcx.RXALT1 AllocationType on Allocation.ALLOC_TYPE_ID = AllocationType.ALLOC_TYPE_ID
        Left Join rcx.RXPIR1 SupLookup on Allocation.SUPPLIER_ID = SupLookup.SUPPLIER_ID And allocation.CONTAINER_TYPE_ID = SupLookup.CONTAINER_TYPE_ID

    Where Allocation.PLANT_ID= '50000036'
) 
SELECT Sup_Num, CONTAINER_CODE, ALLOC_TYPE_DESC, ALLOC_QTY, SAFE_STOCK_QTY, CALC_TOT_ALLOC_REQ_QTY, ALLOC_REQ_QTY, TOT_ALLOC_REQ_QTY, DISC_QTY, FILL_PERCENT,INSERTED_DT
  FROM temp
WHERE rownum = 1

【讨论】:

  • 这似乎很接近,但如果供应商有多个位置具有相同的容器代码 rownum 索引,就好像它们是相同的。例如只看供应商# |位置 |集装箱 |日期,021320 | 01 |美联社 | 2018 年 4 月 16 日和 021320 | 01 |美联社 | 2018 年 4 月 16 日将索引为 1 和 2,但随后为 021320 | 07 |美联社 |由于某种原因,2018 年 4 月 16 日将是 3。
  • 我想通了,我只需要将 SupLookup.SUPPLIER_LOCATION 添加到分区中,它就可以完美运行。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多