kdb q 将表中的某些列翻转为行

问题描述 投票:0回答:1

我有一张这样的桌子:

身份证 原始日期 上一个日期 下一个日期
1A 2024.01.01 2023.04.04 2024.03.01
1B 2024.01.02 2023.02.20 2024.05.01
1C 2024.01.03 2023年12月31日 2024.02.01
tab: ([] ID: `1A`1B`1C; OriginalDate: 2024.01.01 2024.01.02 2024.01.03; PreviousDate: 2023.04.04 2023.02.20 2023.12.31; NextDate: 2024.03.01 2024.05.01 2024.02.01)

我想要做的是创建一个新表,其中每个 PreviousDate 和 NextDate 值都是自己的行,同时保留 ID 和 OriginalDate 值:

日期 身份证 原始日期
2023.04.04 1A 2024.01.01
2024.03.01 1A 2024.01.01
2023.02.20 1B 2024.01.02
2024.05.01 1B 2024.01.02
2023年12月31日 1C 2024.01.03
2024.02.01 1C 2024.01.03

我认为我可以使用翻转并单独拉取值,但我认为可能有一种更快的方法来获取目标表,而无需逐行进行。感谢对此的任何帮助,因为我正在寻找更快的性能,不确定使用翻转是否适合这种情况。

kdb
1个回答
0
投票

flip
ungroup
:

q)ungroup select Date:flip (PreviousDate;NextDate), ID, OriginalDate from tab
Date       ID OriginalDate
--------------------------
2023.04.04 1A 2024.01.01
2024.03.01 1A 2024.01.01
2023.02.20 1B 2024.01.02
2024.05.01 1B 2024.01.02
2023.12.31 1C 2024.01.03
2024.02.01 1C 2024.01.03

查询两次并加入:

q)`ID xasc raze {?[x;();0b;`Date`ID`OriginalDate!y,`ID`OriginalDate]}[tab] each `PreviousDate`NextDate
Date       ID OriginalDate
--------------------------
2023.04.04 1A 2024.01.01
2024.03.01 1A 2024.01.01
2023.02.20 1B 2024.01.02
2024.05.01 1B 2024.01.02
2023.12.31 1C 2024.01.03
2024.02.01 1C 2024.01.03

扩大表格并测试时间:

q)tab:1000000#tab
q)\ts ungroup select Date:flip (PreviousDate;NextDate), ID, OriginalDate from tab
670 291887296
q)\ts raze {?[x;();0b;`Date`ID`OriginalDate!y,`ID`OriginalDate]}[tab] each `PreviousDate`NextDate
3 33556112

测试结果是一样的:(需要注意排序)

q)a:ungroup select Date:flip (PreviousDate;NextDate), ID, OriginalDate from tab
q)b:raze {?[x;();0b;`Date`ID`OriginalDate!y,`ID`OriginalDate]}[tab] each `PreviousDate`NextDate
q)(`Date`ID xasc a)~(`Date`ID xasc b)
1b
© www.soinside.com 2019 - 2024. All rights reserved.