【问题标题】:SAP Hana - SQL - calculate columns on the same table without recursive functionsSAP Hana - SQL - 在没有递归函数的情况下计算同一张表上的列
【发布时间】:2016-11-30 15:14:56
【问题描述】:

我有以下简单的表格,大约。 40k 项:

|date|consum|

根据这张表,我想计算一些新的列。最后,表格应如下所示:

|date|consum|row|row_relativ|min|max|upper|lower|

很遗憾 SAP Hana 数据库不支持递归表语句...

计算规则如下:

  1. 行 = row_number() over(order by dates)
  2. row_relative = row*35040/32768
  3. 分钟 = floor(row_relative)
  4. 最大值 = ceil(row_relative)
  5. min = 从具有最小值的行中选择消耗
  6. max = 从具有最大值的行中选择消耗

目前我有一个包含 5 个变量的存储程序。在每个变量中,我计算 i 新列。它非常非常脏......我怎样才能让它与众不同?我不能使用递归函数...:/

这是我的 sql sn-p...玩得开心 =)

var1 = select *, row_number() over(order by dates) as row from XYZ order by dates limit 34944;
var2 = select *, (row * 34944/32768) as row_relative from :var1;
var3 = select *, floor(row_relative) as min, ceil(row_relative) as max from :var2;

var4 = select 
    p.*,
    (select consumfrom :var3 where row = p.min) as lower,
    (select consumfrom :var3 where row = p.max) as upper
from :var3 p;

var5 = select 
    p.*,
    (p.lower* (1-p.row_relative+p.min)+p.upper * (p.row_relativ - p.min)) as new_consum
from :var4 p;

【问题讨论】:

    标签: sql sap hana


    【解决方案1】:

    您可以在 SQLScript 中使用以下 CTE 公用表表达式 顺便说一句,非常有趣的是,几乎相同的 SQL Server CTE 语法与 SAP HANA SQLScript 语法匹配:)

    with cte as (
    select
        date,
        consum,
        row_number() over (order by date) as row
    from rawdata
    )
    select
        date,
        consum,
        row,
        row * 35040 / 32768 as row_relative,
        floor( (row * 35040 / 32768) ) as min,
        ceil( (row * 35040 / 32768) ) as max,
        (select cte2.consum from cte cte2 where row = floor( (cte.row * 35040 / 32768) ) ) as min2,
        (select cte2.consum from cte cte2 where row = ceil( (cte.row * 35040 / 32768) ) ) as max2
    from cte
    

    【讨论】:

    • HAN​​A CTE 与 SQL Server CTE 语法匹配的原因不足为奇。因为公用表表达式的语法是在 SQL 标准中定义的,而不是由“SQL Server”定义的(微软确实在一定程度上忽略了该标准)。它们不是微软发明的东西。早在微软考虑添加它们之前,其他 DBMS 就已经拥有它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多