对客户记录的最大日期进行分组(多个表)

时间:2016-01-19 16:12:16

标签: sql greatest-n-per-group ibm-midrange db2-400

早上好!

我们有一张表格,显示客户,他们的仓库以及他们的记录上次更改的时间。我的任务是找到特定仓库的最新客户编号。其中大部分都没有改变,但也有不少。我创建了以下查询,完全可以找到我表中所有仓库的最后修改日期。

Select
  WHS,
  Max(AMENDT) As MAX_AMENDT
From
  MBC6REVQ
Group By
  WHS
Order By
  WHS,
  Max(Distinct (Select
    Max(MAX_AMENDT)
  From
    MBC6REVQ
  Group By
    MBC6REVQ.WHS
  Fetch First
    1 Rows Only)) Desc

我遇到的问题是我现在需要添加客户编号并加入我的客户表以检索客户名称。只是添加CUSNO字段会导致错误,因此我必须通过'将CUSNO添加到'组。这为我提供了每个仓库的多个记录。我的数据如下:

    WHS   AMENDT
    A01   1150101
    A01   1130704
    A02   1141030
    A07   1071101
    A10   1020905

..所以查询正确返回:

    WHS   AMENDT
    A01   1150101
    A02   1141030
    A07   1071101
    A10   1020905

我需要添加CUSNO列,因为客户编号已更改。我的查询看起来像:

Select
  WHS,
  CUSNO,
  Max(AMENDT) As MAX_AMENDT
From
  MBC6REVQ
Group By
  WHS, CUSNO
Order By
  WHS,
  Max(Distinct (Select
    Max(AMENDT)
  From
    MBC6REVQ
  Group By
    MBC6REVQ.WHS
  Fetch First
    1 Rows Only)) Desc

...并返回:

    WHS   CUSNO   AMENDT
    A01   1003    1150101
    A01   1056    1130704
    A02   1011    1141030
    A07   1169    1071101
    A10   1012    1020905

......当我需要时:

    WHS   CUSNO   AMENDT
    A01   1003    1150101
    A02   1011    1141030
    A07   1169    1071101
    A10   1012    1020905

有人可以帮忙吗?这真让我抓狂!!!非常感谢任何帮助!

提前致谢

马特

1 个答案:

答案 0 :(得分:2)

我不了解db2400的所有功能,因此如果它支持窗口函数,可能会有更简单/更好的方法来处理它。也就是说,这是最常见的"泛型"我能想到的SQL,所以它最有可能工作。

SELECT
    T1.WHS,
    T1.CUSNO,
    T1.AMENDT
FROM
    MBC6REVQ T1
LEFT OUTER JOIN MBC6REVQ T2 ON
    T2.WHS = T1.WHS AND
    T2.AMENDT > T1.AMENDT
WHERE
    T2.WHS IS NULL

或者,如果db2400支持NOT EXISTS和相关子查询:

SELECT
    T1.WHS,
    T1.CUSNO,
    T1.AMENDT
FROM
    MBC6REVQ T1
WHERE
    NOT EXISTS
    (
        SELECT *
        FROM
            MBC6REVQ T2
        WHERE
            T2.WHS = T1.WHS AND
            T2.AMENDT > T1.AMENDT
    )

在任何一种情况下,您都需要决定如何适当地处理关系和代码。