2016-11-30 35 views
0

我有以下簡單的表格, 40k條目:SAP Hana - SQL - 計算不含遞歸函數的同一個表上的列

|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. 分鐘=選擇該行中的消費與最小值
  6. 最大=選擇該行中的消費與最大值

目前我有一個存儲precedure與5個變量。在每個變量中,我計算我新的coulmn。這是非常非常骯髒的...我怎樣才能讓它不同?我不能使用遞歸函數...:/

這裏是我的SQL片段......玩得開心=)

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; 

回答

0

您可以在SQLScript BTW使用以下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 
+0

爲什麼HANA CTE相匹配的SQL Server的CTE語法是不是一個驚喜的原因。由於公用表表達式的語法是在SQL標準中定義的,而不是由「SQL Server」定義的(並且Microsoft在某種程度上確實忽略了該標準)。他們不是**微軟發明的東西。在微軟甚至考慮過添加它們之前,其他DBMS早已擁有它們 –