Abap 每组数据集中的极值

Abap 每组数据集中的极值,abap,hana-sql-script,cds,amdp,Abap,Hana Sql Script,Cds,Amdp,我有一个用AMDP编写的SQLScript查询,它创建了两个新列source\u contract和target\u contract 返回选择客户端作为客户端, pob_id作为pob_id, 日期更改为, datefrom作为change_from, cast(cast(子字符串(cast(datefrom as char(8)),1,4)as NUMBER(4))as INT) 随着时间的推移, cast(CONCAT('0',(子字符串(cast(datefrom as char(8))

我有一个用AMDP编写的SQLScript查询,它创建了两个新列
source\u contract
target\u contract

返回选择客户端作为客户端,
pob_id作为pob_id,
日期更改为,
datefrom作为change_from,
cast(cast(子字符串(cast(datefrom as char(8)),1,4)as NUMBER(4))as INT)
随着时间的推移,
cast(CONCAT('0',(子字符串(cast(datefrom as char(8)),5,2)))作为VARCHAR(3))
随着时代的变迁,
滞后(合同id,1,'00000000000000')超过(按pob_id划分顺序按pob_id划分,日期从)
作为合同的来源,
合同id作为目标合同
来自farr_d_pob_his
按pob_id订购
原始数据:

POB     Valid To    Valid From  Contract
257147  05.04.2018  05.04.2018  10002718
257147  29.05.2018  06.04.2018  10002719
257147  31.12.9999  30.05.2018  10002239
来自AMDP视图的数据:

我想忽略任何中间行(日期是决定顺序的标准)。有什么建议或想法吗


我曾想过使用
groupby
获取最大日期和最小日期,并在单独的消费视图中对这些条目使用union,但如果我们使用
groupby
则无法获取其他条目。另一种可能是按日期订购,但在CD中不可用。

您已经有了带有子选项的最佳解决方案

伪代码:

SELECT *
  FROM OriginalData
  WHERE (POB, ValidFrom)
     IN (SELECT POB, MIN(ValidFrom)
          FROM OriginalData
          GROUP BY POB)
    OR (POB, ValidTo)
     IN (SELECT POB, MAX(ValidTo)
           FROM OriginalData
           GROUP BY POB);
GROUP BY无法工作,因为它“混合”了不同列中的最小值


一个很好的方法可能是将子选择提取到它们自己的视图中,例如早期的合同PERPOB和最新的合同PERPOB。

您已经有了子选择的最佳解决方案

伪代码:

SELECT *
  FROM OriginalData
  WHERE (POB, ValidFrom)
     IN (SELECT POB, MIN(ValidFrom)
          FROM OriginalData
          GROUP BY POB)
    OR (POB, ValidTo)
     IN (SELECT POB, MAX(ValidTo)
           FROM OriginalData
           GROUP BY POB);
GROUP BY无法工作,因为它“混合”了不同列中的最小值


一个很好的方法可能是将子选择提取到它们自己的视图中,例如早期的合同PERPOB和最新的合同PERPOB。

以下是任务解决方案的概念证明

假设我们已根据表
mara
预先选择了材料类型(MTART)数据集,该表与您的非常相似:

------------------------------------------------
|        MATNR     |   ERSDA  |   VPSTA  |MTART|
------------------------------------------------
|       17000000007|18.06.2018|KEDBXCZ   |ZSHD |
|       17000000008|21.06.2018|K         |ZSHD |
|       17000000011|21.06.2018|K         |ZSHD |
|       17000000023|22.06.2018|KEDCBGXZLV|ZSHD |  
|       17000000103|09.01.2019|K         |ZSHD |
|       17000000104|09.01.2019|K         |ZSHD |
|       17000000105|09.01.2019|K         |ZSHD |
|       17000000113|06.02.2019|V         |ZSHD |
------------------------------------------------
以下是材料,我们希望在创建日期(ERSDA)之前只保留最后一个和第一个材料(MATNR),并查找第一个和最后一个材料的维护类型(VPSTA

------------------------------------------------
|        MATNR     |   ERSDA  |   VPSTA  |MTART|
------------------------------------------------
|       17000000007|18.06.2018|KEDBXCZ   |ZSHD |
|       17000000113|06.02.2019|V         |ZSHD |
------------------------------------------------
在您的情况下,您同样可以在每个POB
mtart
)源合同和目标合同contract\u id(最后一个和第一个
vpsta
)中根据datefrom标准(
ersda
)进行搜索

可以通过使用
UNION
和两个带有子查询的选择来实现这一点:

 SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
   FROM mara AS m
  WHERE ersda = ( SELECT MAX( ersda ) FROM mara WHERE mtart = m~mtart )
    UNION SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
     FROM mara AS m2
    WHERE ersda = ( SELECT MIN( ersda ) FROM mara WHERE mtart = m2~mtart )
    ORDER BY type, date
     INTO TABLE @DATA(lt_result).
在这里,您可以注意到第一次选择获取最大
ersda
日期,第二次选择获取最小日期

按类型和日期排序的结果集在某种程度上符合您的要求(F=第一,L=最后):

您的选择应该如下所示:

 SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
   FROM farr_d_pob_his AS farr
  WHERE datefrom = ( SELECT MAX( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr~pob_id )
    UNION SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
     FROM farr_d_pob_his AS farr2
    WHERE datefrom = ( SELECT MIN( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr2~pob_id )
    ORDER BY pob, date
     INTO TABLE @DATA(lt_result).
注意,只有当您有唯一的
datefrom
日期时,这才有效,否则查询将不知道您要使用的最后/第一份合同。此外,若每个POB中只有一个合同,则只有一个记录

关于实现的几句话。在您的示例中,我看到您使用AMDP类,但后来您提到CD不支持
ORDER
。是的,CD和子查询中不支持它们,但AMDP支持它们


您应该区分:AMDP方法的函数和CDS表函数的函数。第一种方法通过排序和子查询完美地处理选择。您可以在演示AMDP功能(包括子查询)的
CL_DEMO_AMDP_VS_OPEN_SQL
DEMO类中查看示例。您可以在AMDP函数中派生代码,并从CDS表函数实现中调用它。

以下是任务解决方案的概念证明

假设我们已根据表
mara
预先选择了材料类型(MTART)数据集,该表与您的非常相似:

------------------------------------------------
|        MATNR     |   ERSDA  |   VPSTA  |MTART|
------------------------------------------------
|       17000000007|18.06.2018|KEDBXCZ   |ZSHD |
|       17000000008|21.06.2018|K         |ZSHD |
|       17000000011|21.06.2018|K         |ZSHD |
|       17000000023|22.06.2018|KEDCBGXZLV|ZSHD |  
|       17000000103|09.01.2019|K         |ZSHD |
|       17000000104|09.01.2019|K         |ZSHD |
|       17000000105|09.01.2019|K         |ZSHD |
|       17000000113|06.02.2019|V         |ZSHD |
------------------------------------------------
以下是材料,我们希望在创建日期(ERSDA)之前只保留最后一个和第一个材料(MATNR),并查找第一个和最后一个材料的维护类型(VPSTA

------------------------------------------------
|        MATNR     |   ERSDA  |   VPSTA  |MTART|
------------------------------------------------
|       17000000007|18.06.2018|KEDBXCZ   |ZSHD |
|       17000000113|06.02.2019|V         |ZSHD |
------------------------------------------------
在您的情况下,您同样可以在每个POB
mtart
)源合同和目标合同contract\u id(最后一个和第一个
vpsta
)中根据datefrom标准(
ersda
)进行搜索

可以通过使用
UNION
和两个带有子查询的选择来实现这一点:

 SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
   FROM mara AS m
  WHERE ersda = ( SELECT MAX( ersda ) FROM mara WHERE mtart = m~mtart )
    UNION SELECT ersda AS date, matnr AS max, mtart AS type, vpsta AS maint
     FROM mara AS m2
    WHERE ersda = ( SELECT MIN( ersda ) FROM mara WHERE mtart = m2~mtart )
    ORDER BY type, date
     INTO TABLE @DATA(lt_result).
在这里,您可以注意到第一次选择获取最大
ersda
日期,第二次选择获取最小日期

按类型和日期排序的结果集在某种程度上符合您的要求(F=第一,L=最后):

您的选择应该如下所示:

 SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
   FROM farr_d_pob_his AS farr
  WHERE datefrom = ( SELECT MAX( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr~pob_id )
    UNION SELECT datefrom as change_from, contract_id AS contract, pob_id AS pob
     FROM farr_d_pob_his AS farr2
    WHERE datefrom = ( SELECT MIN( datefrom ) FROM farr_d_pob_his WHERE pob_id = farr2~pob_id )
    ORDER BY pob, date
     INTO TABLE @DATA(lt_result).
注意,只有当您有唯一的
datefrom
日期时,这才有效,否则查询将不知道您要使用的最后/第一份合同。此外,若每个POB中只有一个合同,则只有一个记录

关于实现的几句话。在您的示例中,我看到您使用AMDP类,但后来您提到CD不支持
ORDER
。是的,CD和子查询中不支持它们,但AMDP支持它们


您应该区分:AMDP方法的函数和CDS表函数的函数。第一种方法通过排序和子查询完美地处理选择。您可以在演示AMDP功能(包括子查询)的
CL_DEMO_AMDP_VS_OPEN_SQL
DEMO类中查看示例。您可以在AMDP函数中派生代码,并从CDS表函数实现中调用它。

什么是中间项?在您的示例数据上显示它们问题中已经有数据,让我来分享上下文。每次都会创建合同,但我们只关心第一个合同和最后一个合同。可能有b