2016-03-11 18 views
0

我有以下表從Q.如何將函數應用於整個列?

q)r 
some_int this    created_at     updated_at   .. 
    -----------------------------------------------------------------------------.. 
1231231 "ASD" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29... 
13312 "TSM" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29... 

JDBC連接,我想下​​面的功能,適用於第一列。

deviation:{a:avg x; sqrt avg (x*x)-a*a} 

這適用於數組。

q)l 
1 2 3 4 
q)deviation l 
1.118034 

如何將偏差應用於表中的列?看來我的方法是行不通的:

q)select deviation(some_id) from r 
'rank 

UPDATE:

我無法解釋如下:

q)select avg(some_int) from r 
some_int 
--------- 
1005341 
q)select min(some_int) from r 
some_int 
--------- 
812361 
q)select max(some_int) from r 
some_int 
--------- 
1184014 
q)select sum(some_int) from r 
some_int 
--------- 
+1

我的回答更新爲你的第二個問題 – terrylynch

回答

4

你需要爭取的結果,如果它是一個原子,因爲表的列必須是列出,而不是原子。通常kdb可以爲你做到這一點,但往往不是當你執行自己的自定義聚合。例如,即使你定義一個函數SUM2是總和的精確副本:

q)sum2:sum 

KDB只能識別和作爲一個聚集,並會自動徵用,但不適合SUM2

q)select sum col1 from ([]col1:1 2 3 4) 
col1 
---- 
10 

q)select sum2 col1 from ([]col1:1 2 3 4) 
'rank 

所以你需要在第二種情況下,爭取:

q)select enlist sum2 col1 from ([]col1:1 2 3 4) 
col1 
---- 
10 

UPDATE:

要回答你的第二個問題 - 看起來你的數字總和溢出了整數的邊界。您需要將它們轉換爲長整數

q)select sum col1 from ([]col1:2147483645 1i) 
col1 
---------- 
2147483646 

以上是最大整數。再增加一個給人無限類型爲int的

q)select sum col1 from ([]col1:2147483645 1 1i) 
col1 
---- 
0W 

添加任何東西更重要的是顯示一個空(零)

q)select sum col1 from ([]col1:2147483645 1 1 1i) 
col1 
---- 

解決方案是總結前投長(或讓他們在第一時間長)

q)select sum `long$col1 from ([]col1:2147483645 1 1 1i) 
col1 
---------- 
2147483648 
+0

水壩,你只是打我吧:) –

+0

哈,對不起哈哈。另外,我認爲它識別的聚合存儲在.Q.a0和/或.Q中。a1 – terrylynch

+0

非常感謝你這是有道理的。由於一些奇怪的原因,我得到空的結果。見上面我更新了這個問題。 – Istvan

0

你得到一個等級是因爲該函數沒有返回一個列表。由於該函數返回一個單一的數字,可能你只想要單個數字答案?在這種情況下,你可以簡單的索引表(或使用exec)來獲得的列向量,並將其應用於:

deviation t`some_id 

不然,如果你想保留一個表作爲答案,如果你爭取的結果:

select enlist deviation some_id from t 
相關問題