如何在 SAP HANA 中加入特定的最大行

How to Join Specific Max Row in SAP HANA

您好,我正在 SAP HANA 中执行查询并尝试只获取包含最新项目的唯一记录(在本例中为合同开始日期):

我运行的查询是这样的:

SELECT 
 A1."ObjectShipToPartyName",
 A1."ObjectShipToParty",
 A1."ObjShippedDate",
 A1."ObjInstalledDate",
 A1."ProductModelNumber",
 A1."RefProd",
 A1."RefProdDescription",
 A1."AssetType",
 A1."IbaseComponentType",
 A1."WarrantyStartDate",
 A1."WarrantyEndDate",
 A1."WarrantyStartDateStatus",
 A1."WarrantyEndDateStatus",
 A1."ValidWarrStartDate",
 A1."ValidWarrEndDate",
 A1."IbaseObjectID",
 A1."AssociatedIBaseID",
 A2."ContractID",
 Max(A2."HDRStartDate") AS "HDRStartDate",
 Max(A2."HDREndDate") AS "HDREndDate",
 A2."ContractType"

FROM "Table1" A1 

LEFT OUTER JOIN "Table2" A2
    ON LTRIM(A2."IBASEID", 0) = LTRIM(A1."AssociatedIBaseID", 0) 

WHERE A1."AssetType" = '01'
    AND Cast(A1."ObjShippedDate" AS Date) > TO_DATE('20070801', 'YYYYMMDD') 
    AND A2."LineStatusText" IN ('Active','Completed')
    AND A2."HDRStatusTxt" IN  ('Active','Completed')
    AND A2."ContractType" <> 'ZQAS'

 GROUP BY
 A1."ObjectShipToPartyName",
 A1."ObjectShipToParty",
 A1."ObjShippedDate",
 A1."ObjInstalledDate",
 A1."ProductModelNumber",
 A1."RefProd",
 A1."RefProdDescription",
 A1."AssetType",
 A1."IbaseComponentType",
 A1."WarrantyStartDate",
 A1."WarrantyEndDate",
 A1."WarrantyStartDateStatus",
 A1."WarrantyEndDateStatus",
 A1."ValidWarrStartDate",
 A1."ValidWarrEndDate",
 A1."IbaseObjectID",
 A1."AssociatedIBaseID",
 A2."ContractID",
 A2."ContractType"

给出的数据如下所示:

这里我只对保留突出显示行的合同感兴趣。非常感谢任何帮助,我是 SQL.

的新手

这是一个常见的要求。根据您的说明,解决方案可能如下所示:

SELECT 
 A1."ObjectShipToPartyName",
 A1."ObjectShipToParty",
 A1."ObjShippedDate",
 A1."ObjInstalledDate",
 A1."ProductModelNumber",
 A1."RefProd",
 A1."RefProdDescription",
 A1."AssetType",
 A1."IbaseComponentType",
 A1."WarrantyStartDate",
 A1."WarrantyEndDate",
 A1."WarrantyStartDateStatus",
 A1."WarrantyEndDateStatus",
 A1."ValidWarrStartDate",
 A1."ValidWarrEndDate",
 A1."IbaseObjectID",
 A1."AssociatedIBaseID",
 A2."ContractID",
 A2."HDRStartDate"
 A2."HDREndDate"
 A2."ContractType"

FROM 
    "Table1" A1 

    LEFT OUTER JOIN "Table2" A2
    ON LTRIM(A2."IBASEID", 0) = LTRIM(A1."AssociatedIBaseID", 0) 

    inner join
         (SELECT "IBASEID", MAX("HDREndDate") as "MAX_HDREndDate"
          FROM "Table2" 
          WHERE 
                "LineStatusText" IN ('Active','Completed')
            AND "HDRStatusTxt" IN  ('Active','Completed')
            AND "ContractType" !='ZQAS'
          GROUP BY "IBASEID") S2

    on (A2."IBASEID", A2."HDREndDate") = (S2."IBASEID", S2."MAX_HDREndDate")

WHERE 
    A1."AssetType" = '01'
    AND TO_DATE(A1."ObjShippedDate") > TO_DATE('20070801', 'YYYYMMDD');

聚合需要与实际数据收集处于不同的级别。因此,您首先要找到每个 IBASEID 中所有最多 current/max 的日期,然后检索这些记录所需的详细信息。
结果集是您加入 Table1.

的内容

旁注:为了可读性,我会坚持使用一种类型转换(TO_DATECAST)。加入转换后的 IBASEID 也不会提高性能。更好的选择是以正确的格式存储数据。