代码之家  ›  专栏  ›  技术社区  ›  user3593083

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

  •  1
  • user3593083  · 技术社区  · 9 年前

    早上好!

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

    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 回复  |  直到 9 年前
        1
  •  2
  •   Tom H zenazn    9 年前

    我不知道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
        )
    

    在这两种情况下,您还需要决定如何处理关系,并为此适当地编写代码。