Redshift创建自动排序且NULL值后置的表遇问题求助
Redshift 创建指定列排序且NULL值排最后的表
关于Redshift Sortkey的误区
你用sortkey定义的是表的物理存储排序,它的核心作用是优化查询性能(比如减少扫描的数据量),但不会让查询结果默认按这个顺序返回——Redshift查询返回数据的默认顺序是数据的存储块读取顺序,和插入顺序或sortkey的物理排序不一定一致,必须显式用ORDER BY才能保证结果的排序顺序。
实现NULL值排最后的两种方式
方式1:查询时显式指定排序(推荐,灵活)
在查询语句里用ORDER BY,直接使用Redshift支持的NULLS LAST语法,简洁实现需求:
SELECT * FROM temp ORDER BY date NULLS LAST;
如果需要更复杂的排序逻辑,也可以用CASE表达式控制NULL的位置:
SELECT * FROM temp ORDER BY CASE WHEN date IS NULL THEN 1 ELSE 0 END, -- 标记NULL值为1,非NULL为0,确保NULL排最后 date; -- 非NULL值按date升序排列
方式2:通过计算列作为Sortkey实现存储层面NULL后置
如果希望物理存储时NULL就排在最后,可以创建一个计算列作为sortkey,用极大值替代NULL:
CREATE TEMP TABLE temp ( id integer, date date, month integer, cost integer, sort_date AS CASE WHEN date IS NULL THEN '9999-12-31' ELSE date END sortkey );
插入数据后,物理存储会按sort_date排序,NULL值对应的sort_date是'9999-12-31',会排在所有有效日期之后。但注意,查询时仍需显式ORDER BY才能保证返回顺序,不过此时查询性能会因为sortkey的存在而提升。
验证效果
使用方式1的查询语句,即可得到非NULL的date按升序排列、所有NULL值排在最后的结果。
内容的提问来源于stack exchange,提问作者Raksha
相关产品推荐
相关产品推荐

