仅更新 KDB 中的非空白
Update only for non-blanks in KDB
我有一个查询 tab
,列 date
,格式 yyyy.mm.dd
。我想将这些日期转换为 yyyy-mm-dd
格式,我可以在下面成功完成:
q) tab:update date:{"0"^"-"sv'flip 4 -2 -2$'string`year`mm`dd$\:x}date from tab
但是,我列中的某些值是空白的,对于这些值,我将得到 0000-00-00
。从我了解到我可能可以将它们替换为空白,但它似乎不是很有效:
date[; "0000-00-00"; ""]
我想知道是否有人可以指出正确的方向来仅针对非空值更新整个列?我猜它与 [date not like ""]
类似,但我无法将其作为单个命令与我的 update
语句一起使用。谢谢。
也许是这样的?
q)update date:{"-" sv "." vs string x}'[date] from tab
date
------------
"2020-07-16"
""
"2020-07-15"
您可以通过更改解析日期的方式来完全避免此问题:
q)t:([]date:`date$(10?100),0N)
q)t
date
----------
2000.01.20
2000.01.18
2000.03.28
2000.03.23
2000.02.15
2000.02.10
2000.02.02
2000.02.07
2000.01.26
2000.02.08
q)update ssr[;".";"-"]each string date from t
date
------------
"2000-01-20"
"2000-01-18"
"2000-03-28"
"2000-03-23"
"2000-02-15"
"2000-02-10"
"2000-02-02"
"2000-02-07"
"2000-01-26"
"2000-02-08"
""
这在每个日期上使用 ssr 函数来简单地将每个 "."
替换为 "-"
。
要回答您原来的问题,带有 where 子句的更新语句不起作用的原因是因为您的原始列是日期类型。更新语句只会将此列的一个子集转换为字符串类型,导致混合列表,这与日期类型的列不兼容。为避免这种情况,在仍然使用原始代码的同时,您可以使用条件向量更新 (https://code.kx.com/q/ref/vector-conditional/)
q)tab:([]date:(3?.z.d),2#0Nd)
q)parseDate:{"0"^"-"sv'flip 4 -2 -2$'string`year`mm`dd$\:x}
q)update date:parseDate date from tab where not null date
'type
q)update date:?[not null date;parseDate date;count[i]#enlist""]from tab
date
------------
"2006-06-02"
"2017-05-31"
"2006-09-28"
""
""
提供的其他解决方案以更直接的方式实现了相同的目标,因此我建议使用其中之一。
我有一个查询 tab
,列 date
,格式 yyyy.mm.dd
。我想将这些日期转换为 yyyy-mm-dd
格式,我可以在下面成功完成:
q) tab:update date:{"0"^"-"sv'flip 4 -2 -2$'string`year`mm`dd$\:x}date from tab
但是,我列中的某些值是空白的,对于这些值,我将得到 0000-00-00
。从
date[; "0000-00-00"; ""]
我想知道是否有人可以指出正确的方向来仅针对非空值更新整个列?我猜它与 [date not like ""]
类似,但我无法将其作为单个命令与我的 update
语句一起使用。谢谢。
也许是这样的?
q)update date:{"-" sv "." vs string x}'[date] from tab
date
------------
"2020-07-16"
""
"2020-07-15"
您可以通过更改解析日期的方式来完全避免此问题:
q)t:([]date:`date$(10?100),0N)
q)t
date
----------
2000.01.20
2000.01.18
2000.03.28
2000.03.23
2000.02.15
2000.02.10
2000.02.02
2000.02.07
2000.01.26
2000.02.08
q)update ssr[;".";"-"]each string date from t
date
------------
"2000-01-20"
"2000-01-18"
"2000-03-28"
"2000-03-23"
"2000-02-15"
"2000-02-10"
"2000-02-02"
"2000-02-07"
"2000-01-26"
"2000-02-08"
""
这在每个日期上使用 ssr 函数来简单地将每个 "."
替换为 "-"
。
要回答您原来的问题,带有 where 子句的更新语句不起作用的原因是因为您的原始列是日期类型。更新语句只会将此列的一个子集转换为字符串类型,导致混合列表,这与日期类型的列不兼容。为避免这种情况,在仍然使用原始代码的同时,您可以使用条件向量更新 (https://code.kx.com/q/ref/vector-conditional/)
q)tab:([]date:(3?.z.d),2#0Nd)
q)parseDate:{"0"^"-"sv'flip 4 -2 -2$'string`year`mm`dd$\:x}
q)update date:parseDate date from tab where not null date
'type
q)update date:?[not null date;parseDate date;count[i]#enlist""]from tab
date
------------
"2006-06-02"
"2017-05-31"
"2006-09-28"
""
""
提供的其他解决方案以更直接的方式实现了相同的目标,因此我建议使用其中之一。