seq_skip_nan
seq_skip_nan()
序列函数可用于在 SQL 序列操作中跳过 NaN(非数字)值。以下步骤说明了该函数的使用方法:
- 创建一个示例表并用数据填充它,例如:
CREATE TABLE QuoteFlat(symbol string, bid float, ask float);
INSERT INTO QuoteFlat VALUES('AAA', 1.01, 1.02);
INSERT INTO QuoteFlat VALUES('AAA', 'nan', 'nan');
INSERT INTO QuoteFlat VALUES('AAA', 1.03, 'nan');
INSERT INTO QuoteFlat VALUES('AAA', 'nan', 1.05);
INSERT INTO QuoteFlat VALUES('AAA', 1.05, 1.06);
CREATE TABLE Quote(symbol string PRIMARY KEY, bid sequence(float), ask sequence(float));
INSERT OR UPDATE INTO Quote(symbol, bid, ask) SELECT symbol, bid, ask FROM QuoteFlat;
- 现在可以选择仅有效的值,例如:
SELECT symbol, seq_skip_nan(bid) FROM Quote;
- 序列中存在 NaN 值会导致算术运算和聚合函数的结果为 NaN:
SELECT seq_avg(bid) FROM Quote WHERE symbol='AAA';
#1
------------------------------------------------------------------------------
nan
可以使用 seq_skip_nan() API 来忽略 NaN 值:
SELECT seq_avg(seq_skip_nan(bid)) FROM Quote WHERE symbol='AAA';
#1
------------------------------------------------------------------------------
1.02999997138977
- 由于对 NaN 值进行算术运算会得到 NaN,因此可以对序列中的所有元素执行操作,然后丢弃无效的结果。考虑一个示例,其中计算了买入价和卖出价的平均值:
SELECT (bid+ask)/2 FROM Quote WHERE symbol='AAA';
#1
------------------------------------------------------------------------------
{1.01499998569489, nan, nan, nan, 1.05499994754791}
seq_skip_nan() 函数可用于跳过无效结果:
SELECT seq_skip_nan((bid+ask)/2) FROM Quote WHERE symbol='AAA';
#1
------------------------------------------------------------------------------
{1.01499998569489, 1.05499994754791}
关于 Microsoft Windows 中的 NaN 值的说明
在 Microsoft Windows 环境中,NULL 值表示为 0.0/0.0,而非“nan”字符串。这是传递到 SQL 语句中的值。
请注意,如果在 C/C++ 应用程序中将 0.0/0.0 作为参数传递,Visual Studio 2013 没有定义“nan”或“nanf”符号。因此,可以在应用程序代码中使用以下解决方法:
#ifdef _WIN32
#if _MSC_VER < 1900 /* Visual Studio 2013 and earlier */
#include <float.h>
#define isnan _isnan
const unsigned long nan[2]={0xffffffff, 0x7fffffff};
#define nan(s) (*( double* )nan)
#define nanf(s) (*( float* )nan)
#endif
#endif
从Visual Studio 2015中可以看到“nan”和“nanf”符号。