2016-10-01 3 views
3

집계 함수 sum (x), avg (x), max (x), min (x) 은 x가 비어 있거나 NULL 값만 포함하면 NULL을 반환합니다.KDB에서 null을 반환하는 집계 함수 얻기

KDB에서 sum과 avg는 0을 반환하고 max와 min은 (+ 또는 -) 무한대를 반환합니다.

(A)에 널 (null)을 제거하고, 평소

nsum:{[x] x: x where not null x; $[0=count x; 0N; sum x]} 

로 집계되기 전에 결과가 비어 있는지 확인 (:

내가 2 옵션으로 올라와있다 null을 반환 원하는 동작을 얻으려면 B) 축적하기 전에 각 항목에서 누락 여부를 확인하는 새 집계를 만듭니다.
빈 목록이 있는지 계속 확인해야합니다.

nsum:{[z] $[0=count z; 0N; {[x;y] $[null x; y; null y; x; x+y]}/ z ]} 

A 또는 B보다 나은 (더 빠르고 편리한) 방법이 있습니까?

방법 (B)는 방법 (A)보다 효과가 있습니까?

방법 (A)는 모든 집계 함수로 작업 할 수 있다는 장점이 있습니다. 평균 (이미 적용된 항목 수를 알아야 함)을 산출 할 쌍 함수 ( )가 없으므로 방법 (B)는 "평균"에 대해 작동하지 않습니다.

관련 질문 : 0= type first x과 같이 빈 목록이 0=count x보다 빠 른지 확인하는 빠른 방법이 있습니까?

고맙습니다!

답변

2

all 연산자를 사용할 수 있습니다. 또한 목록의 유형에 따라 null을 반환 할 수도 있습니다 (아마도).

f:{$[all null x;(neg type x)$"";sum x]} 
q)f `int$() 
0N 
q)f 0n 0n 0n 0n 
0n 

성능이 \t (타이머) 또는 \ts (시간과 공간)를 사용하여 측정합니다. http://code.kx.com/q/ref/syscmds/#t-timer

f1:{$[all null x;(neg type x)$"";sum x]} 
fa:nsum:{[x] x: x where not null x; $[0=count x; 0N; sum x]} 
fb:{[z] $[0=count z; 0N; {[x;y] $[null x; y; null y; x; x+y]}/[z] ]} 

allnull:1000000#0N 
withnull:10000000?(1000#0N,til 10) 
withoutnull:10000000?10 

\ts do[10;f withnull] 
612 16777504 
.. 
.. 

B (fb)가 가장 느린 것을 알 수 있습니다. f1은 fa보다 빠릅니다 (allnull 목록의 경우 별개로 속도는 비슷합니다). 그리고 적은 공간을 사용합니다.

2

min/max의 경우 null을 반환하도록 int/long 목록으로 1을 더하거나 뺄 때 약간의 트릭을 사용할 수 있습니다. 최근 kxCon2016에서 Attila Vrabecz가 언급했습니다. 이것은 "숫자 라인"에 null과 무한대가 나타나는 방법/방식을 조작하는 것입니다. 매우 일반적인 것은 아니지만 각 작업에 따라 다릅니다.

q)a:`int$() 
q)b:1 2 3i 
q)c:0N 0Ni 

q)-1+max 1+a 
0N 
q)-1+max 1+b 
3 
q)-1+max 1+c 
0N 

q)1+min a-1 
0N 
q)1+min b-1 
1 
q)1+min c-1 
0N