我有一张这样的桌子:
身份证 | 原始日期 | 上一个日期 | 下一个日期 |
---|---|---|---|
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 |
我认为我可以使用翻转并单独拉取值,但我认为可能有一种更快的方法来获取目标表,而无需逐行进行。感谢对此的任何帮助,因为我正在寻找更快的性能,不确定使用翻转是否适合这种情况。
与
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