【问题标题】:SAP HANA - Aggregate dates by ranges in SQL ScriptSAP HANA - 在 SQL 脚本中按范围聚合日期
【发布时间】:2023-04-05 05:29:01
【问题描述】:

我在SAP HANA 上有这个table EFF:

OBJECT;PN;MANUFACTURER;MONTH;QTY   
OBJ1;PN1;MAN1;201601;1   
OBJ1;PN1;MAN1;201602;1   
OBJ1;PN1;MAN1;201603;2   
OBJ1;PN1;MAN1;201604;1   
OBJ1;PN1;MAN1;201605;1   
OBJ1;PN1;MAN1;201606;1   

我想通过SQL statement 获得tableOBJECT / PN / MANUF / QTY按日期排序 的聚合视图。这就是我想要的。

对象;PN;制造商;DATE_FROM;DATE_TO;数量
OBJ1;PN1;MAN1;201601;201602;1 (从 01-2016 到 02-2016,OBJ1 包含 1 个 PN1)
OBJ1;PN1;MAN1;201603;201603;2 (从 03-2016 到 03-2016,OBJ1 包含 2 个 PN1)
OBJ1;PN1;MAN1;201604;201606;1 (从 04-2016 到 06-2016,OBJ1 包含 1 个 PN1)

我已经测试了很多解决方案,但没有一个效果很好......我总是得到:

  • 1 行,从 01-2016 到 06-2016,数量 = 1
  • 1 行从 03-2016 到 03-2016,数量 = 2

还不够……

我一直在寻找SAP HANA 中的Window Functions,比如FIRST_VALUE (partition by...)LAST_VALUE,但它无法正常工作...

请问您有什么想法吗?


注意:我已经实现了 stored procedurecursor 来实现它,它可以工作(在几个小时内),但我需要更快的东西。因为它涉及数十亿行。

【问题讨论】:

  • 想要的逻辑还不清楚。每当数量发生变化时,您想要一个新的分组吗?在这种情况下,您应该寻找带有窗口函数的“查找最长连续”示例。
  • 感谢您回答拉斯。是的,我确实想要一个按数量对行进行分组但尊重时间顺序的解决方案。我正在编写基于LEAD / LAGROW_NUMBER 函数的解决方案。

标签: sql sap hana hana-sql-script


【解决方案1】:

我想你想要得到的是如下

select 
    "OBJECT", 
    PN, 
    MANUFACTURER, 
    Month as fromMonth, 
    Lead(Month,1) over (partition by  "OBJECT", PN, MANUFACTURER Order by Month) as toMonth,
    sum(Qty) as qty 
from EFF
group by
    "OBJECT", 
    PN, 
    MANUFACTURER,
    Month

您的示例数据的输出如下图所示

正如你提到的,我使用SQL Lead function 计算下个月 我使用 SUM() 聚合函数的 Group By 子句根据对象、PN 和制造商每月收集数量

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2018-09-02
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多