如何在 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_DATE
或 CAST
)。加入转换后的 IBASEID
也不会提高性能。更好的选择是以正确的格式存储数据。
您好,我正在 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_DATE
或 CAST
)。加入转换后的 IBASEID
也不会提高性能。更好的选择是以正确的格式存储数据。