按客户记录的最大日期分组(多个表)
Grouping on Max date for a Customer Record (multiple tables)
大家早上好!
我们有一个 table 显示客户、他们的仓库以及他们的记录上次更改的时间。我的任务是查找特定仓库的最新客户编号。其中大部分没有改变,但也有不少改变了。我创建了以下查询,它可以完美地找到我 table 中所有仓库的最后修改日期。
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
我遇到的问题是我现在需要添加客户编号并加入我的客户 table 以检索客户名称。仅添加 CUSNO 字段会导致错误,因此我必须将 CUSNO 添加到 'group by'。这为我提供了每个仓库的多个记录。我的数据如下所示:
WHS AMENDT
A01 1150101
A01 1130704
A02 1141030
A07 1071101
A10 1020905
..所以查询正确 returns:
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
...和returns:
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
有人可以帮忙吗?这真让我抓狂!!!非常感谢任何帮助!
提前致谢
马特
我不知道 db2400 的所有功能,所以如果它支持窗口函数,可能有 easier/better 方法来处理这个问题。也就是说,这是我能想到的最多"generic"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
)
在任何一种情况下,您还需要决定如何处理关系并为此适当地编写代码。
大家早上好!
我们有一个 table 显示客户、他们的仓库以及他们的记录上次更改的时间。我的任务是查找特定仓库的最新客户编号。其中大部分没有改变,但也有不少改变了。我创建了以下查询,它可以完美地找到我 table 中所有仓库的最后修改日期。
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
我遇到的问题是我现在需要添加客户编号并加入我的客户 table 以检索客户名称。仅添加 CUSNO 字段会导致错误,因此我必须将 CUSNO 添加到 'group by'。这为我提供了每个仓库的多个记录。我的数据如下所示:
WHS AMENDT
A01 1150101
A01 1130704
A02 1141030
A07 1071101
A10 1020905
..所以查询正确 returns:
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
...和returns:
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
有人可以帮忙吗?这真让我抓狂!!!非常感谢任何帮助!
提前致谢
马特
我不知道 db2400 的所有功能,所以如果它支持窗口函数,可能有 easier/better 方法来处理这个问题。也就是说,这是我能想到的最多"generic"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
)
在任何一种情况下,您还需要决定如何处理关系并为此适当地编写代码。