2022.01.03 11:07 PM
Hello q experts,
I have a table created like below.
t:([]c1: 1 2 3 4 5 6 7 8 9)
Below statement works fine as I am using previous value of column c1.
update c2:((prev(c1)+10) + c1)%2 from t
If I try to use previous value from column c2, then there is a error.
update c2:((prev(c2)+10) + c1)%2 from t
How can I use the previous calculated value of c2 in the current row calculation?
2022.01.04 10:24 AM
https://code.kx.com/q/ref/accumulators/#binary-values
q)select c1,c2:0{(x+10+y)%2}\c1 from t
c1 c2
-----------
1 5.5
2 8.75
3 10.875
4 12.4375
5 13.71875
6 14.85938
7 15.92969
8 16.96484
9 17.98242
2022.01.04 06:46 AM
q)t:([]c1: 1 2 3 4 5 6 7 8 9)
q)update c2:((prev(c1)+10) + c1)%2 from `t
`t
q)update c2:((prev(c2)+10) + c1)%2 from `t
`t
q)t
c1 c2
--------
1
2
3 9.75
4 10.75
5 11.75
6 12.75
7 13.75
8 14.75
9 15.75
2022.01.04 07:07 AM
Thanks for the reply vkennedy.
Actually I don't want to update the existing table at all. Sorry for confusing with update keyword. (But I learnt something new here Thanks).
Please consider below case. The select fails here.
t:([]c1: 1 2 3 4 5 6 7 8 9)
select c1, c2:((prev(c2)+10) + c1)%2 from t
How can I use the previous calculated value of c2 in the current row calculation? For the first row in the table there is no prev(c2); so that could be considered as 0. From the second row, it should consider the previous calculated value of c2.
2022.01.04 07:29 AM
Hi,
Is this the result you are looking for?
q)select c2:(0^(prev(c2)+10) + c1)%2 from update c2:((0^prev(c1)+10) + c1)%2 from t
c2
-----
0
6.25
9.75
10.75
11.75
12.75
13.75
14.75
15.75
In this case, you need to explicitly fill in the zero as the result of prev on the first item of a list is null.
2022.01.04 09:13 AM
Hi,
I have added the calculations below.
c1 | c2 | Calculation | |
1 | 5.5 | =((0+10) + 1)/2 | =((prev(c2)+10)+c1)/2 |
2 | 8.75 | =((5.5+10) + 2)/2 | |
3 | 10.875 | =((8.75+10) + 3)/2 | |
4 | 12.4375 | =((10.875+10) + 4)/2 | |
5 | 13.71875 | =((12.4375+10) + 5)/2 | |
6 | 14.859375 | =((13.71875+10) + 6)/2 | |
7 | 15.9296875 | =((14.859375+10) + 7)/2 | |
8 | 16.96484375 | =((15.9296875+10) + 8)/2 | |
c2 column values is the expected result.
2022.01.04 10:24 AM
https://code.kx.com/q/ref/accumulators/#binary-values
q)select c1,c2:0{(x+10+y)%2}\c1 from t
c1 c2
-----------
1 5.5
2 8.75
3 10.875
4 12.4375
5 13.71875
6 14.85938
7 15.92969
8 16.96484
9 17.98242
2022.01.04 08:57 PM
Wow!! Thanks Jason & vkennedy.
EMEA
Tel: +44 (0)28 3025 2242
AMERICAS
Tel: +1 (212) 447 6700
APAC
Tel: +61 (0)2 9236 5700
KX. All Rights Reserved.
KX and kdb+ are registered trademarks of KX Systems, Inc., a subsidiary of FD Technologies plc.