(q/kdb+) 如何对具有轻微日期差异(+/-1 天)的数据进行分组以创建唯一标识符

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

我正在尝试为每个孩子创建

uniqueid
列(因为它们在表中出现多次),以便我可以识别具有相同名称的孩子(没有孩子具有相同的
dadname
mumname
childdob

q)group select dadname, mumname, childdob from peopletb
dadname         mumname            childdob   |                  
----------------------------------------------| -----------------
simon           jessica             2007.03.27| 0 1658 2292 18295
mike            rachel              2007.02.06| 1 4293 10976 33439 53751 63077 81844 90244 98782 ..
james           lucy                2005.04.09| 2 12756 21354
francis         anne                2007.04.12| 3 4151 8252 159075 172735 175531 177199 206953 40..
francis         anne                2007.04.13| 7 3255 7292 128021 143595 157839 168120 186578 21..
mike            rachel              2007.02.05| 10 4292 10946 33339 56751 67077 82844 96244 99381 ..

等等

问题是,

childdob
存在一些细微的差异,它增加了一天,或者相反,它回退了一天。

当对数据进行分组时,我希望它能够相互分组

childdob
+1 或 -1,以便消除差异。

例如

mike            rachel              2007.02.05| 10 4292 10946 33339 56751 67077 82844 96244 99381 ..
&
mike            rachel              2007.02.06| 1 4293 10976 33439 53751 63077 81844 90244 98782 ..

将具有相同的 uniqueid

如愿

francis         anne                2007.04.12| 3 4151 8252 159075 172735 175531 177199 206953 40..
&
francis         anne                2007.04.13| 7 3255 7292 128021 143595 157839 168120 186578 21..
kdb
1个回答
0
投票

当您不知道真正的 dob 时,并且如果您在上方和下方都有数据点,则会出现一些棘手的边缘情况,但类似这样的事情可能是一个起点:

peopletb:([]dadname:100?`simon`mike`james;mumname:100?`jessica`rachel`lucy;childdob:100?2007.01.03 2007.01.02 2007.01.04 2007.06.01 2007.08.10 2007.08.09 2007.10.23 2007.10.24)

/default grouping
q)select idx:i by dadname,mumname,childdob from `childdob xasc peopletb
dadname mumname childdob  | idx
--------------------------| --------------
james   jessica 2007.01.02| ,9
james   jessica 2007.01.04| ,26
james   jessica 2007.08.09| 56 58 59
james   jessica 2007.08.10| 75 77
james   jessica 2007.10.24| ,96
james   lucy    2007.01.02| ,3
james   lucy    2007.01.03| 13 21 24
...

/step 1 - fudge the date
q)fudge:update childdob:{(y;x)2>y-x}\[childdob]by dadname,mumname from `childdob xasc peopletb;
/step 2 - group the fudged dates
q)select idx:i by dadname,mumname,childdob from fudge
dadname mumname childdob  | idx
--------------------------| --------------------------
james   jessica 2007.01.02| ,9
james   jessica 2007.01.04| ,26
james   jessica 2007.08.09| 56 58 59 75 77
james   jessica 2007.10.24| ,96
james   lucy    2007.01.02| 3 13 21 24
james   lucy    2007.01.04| ,34
james   lucy    2007.08.09| 50 51 55 60 65 66 70 76 78
...

注意 james/jessica 如何将 2007.08.09/10 合并为 09,但没有合并 2007.01.02/04(不明确)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.