问题描述
给出下表
time kind counter key1 value
----------------------------------------
1 1 1 1 1
2 0 1 1 2
3 0 1 2 3
5 0 1 1 4
5 1 2 2 5
6 0 2 3 6
7 0 2 2 7
8 1 3 3 8
9 1 4 3 9
如何选择第一行中的值 紧接在每个之后 按时间排序的种类1的行,其中key1 两种情况下的值都相同。即:
time value prevvalue nextvalue
---------------------------------------------
1 1 0n 2
5 5 3 7
8 8 6 0n
9 9 6 0n
这是我尝试过的一些事情 老实说,我不知道如何规范地实现 在q中类似这样,先验值具有 变量偏移到当前行?
select
prev[value],next[value],by key1 where kind<>1
update 0N^prevval,0N^nextval from update prevval:prev value1,nextval:next value1 by key1 from table
关于如何实现此目标的一些建议或指示将是很棒的! 谢谢
解决方法
我能够使用以下代码返回满足您要求的表。如果正确,那么您提供的样本表是不正确的,否则我会误解了这个问题。
q)table:([] time:1 2 3 5 5 6 7 8 9;kind:1 0 0 0 1 0 0 1 1;counter:1 1 1 1 2 2 2 3 4;key1:1 1 2 1 2 3 2 3 3;value1:1 2 3 4 5 6 7 8 9)
q)tab2:update 0N^prevval,0N^nextval from update prevval:prev value1,nextval:next value1 by key1 from table
q)tab3:select from tab2 where kind=1
time value1 prevval nextval
---------------------------
1 1 2
5 5 3 7
8 8 6 9
9 9 8
tab2中的更新语句:
update 0N^prevval,nextval:next value1 by key1 from table
只是在原始表上添加2列,每行的上一个和下一个值。 0^
用空值填充空白字段。
tab3中的select语句:
tab3:select from tab2 where kind=1
正在为kind = 1的行过滤tab2。
最终选择语句:
select time,value1,prevval,nextval from tab3
正在选择要在最终结果中返回的行。
希望这能回答您的问题。
谢谢, 凯特琳