首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每组数据集中的极值

每组数据集中的极值
EN

Stack Overflow用户
提问于 2019-10-03 18:37:20
回答 2查看 359关注 0票数 1

我有一个用AMDP编写的SQLScript查询,它创建了两个新列source_contracttarget_contract

代码语言:javascript
复制
RETURN SELECT client as client,
    pob_id as pob_id,
    dateto as change_to,
    datefrom as change_from,
    cast( cast( substring( cast( datefrom as char( 8 ) ), 1,4 ) as NUMBER ( 4 ) ) as INT )
        as change_year,
    cast( CONCAT( '0' , ( substring( cast( datefrom as char( 8 ) ), 5,2  ) ) ) as VARCHAR (3))
        as change_period,
    LAG( contract_id, 1, '00000000000000' ) OVER ( PARTITION BY pob_id ORDER BY pob_id, datefrom )
        as source_contract,
    contract_id as target_contract
    from  farr_d_pob_his
    ORDER BY pob_id

原始数据:

代码语言:javascript
复制
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视图中的数据:

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

我想使用Group by获取最大日期和最小日期,并在单独的消费视图中对这些条目使用联合,但是如果我们使用的是group by,则无法获取其他条目。另一种可能是按日期订购,但CDS中没有。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-04 09:31:35

您已经有了带有子选择的最优解。

伪码:

代码语言:javascript
复制
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不会工作,因为它“混合”了不同列中的最小值。

一个很好的触摸可能是将子选择提取到自己的视图中,例如。EarliestContractPerPob和LatestContractPerPob.

票数 0
EN

Stack Overflow用户

发布于 2019-10-27 01:41:35

这是你的任务的解决方案的证明.

如果我们已经按材料类型(MTART)预选了基于表mara的数据集,该数据集与您的非常相似:

代码语言:javascript
复制
------------------------------------------------
|        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 |
------------------------------------------------

这里是材料,我们只想留下最后和第一个材料(MATNR)的创建日期(ERSDA),并找到维护类型(VPSTA)的第一个和最后一个。

代码语言:javascript
复制
------------------------------------------------
|        MATNR     |   ERSDA  |   VPSTA  |MTART|
------------------------------------------------
|       17000000007|18.06.2018|KEDBXCZ   |ZSHD |
|       17000000113|06.02.2019|V         |ZSHD |
------------------------------------------------

在您的示例中,您类似地在每个POB (mtart)源和目标contracts contract_id (LastandFirstvpsta)中根据datefrom标准(ersda)进行搜索。

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

代码语言:javascript
复制
 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 = first,L= last):

您的选择应该看起来有点像这样:

代码语言:javascript
复制
 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日期时,这才能工作,否则查询将不知道要使用哪一个最后/第一个契约。另外,如果每瓶中只有一份合同,则只有一项记录。

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

您应该区分两类AMDP函数:AMDP方法的函数和CDS表函数。第一种方法很好地处理带有排序和子查询的选择。您可以查看CL_DEMO_AMDP_VS_OPEN_SQL演示类中的示例,这些示例演示了AMDP特性,包括子查询。您可以从AMDP函数中派生代码,并从CDS表函数实现中调用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58225080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档