postgresql - 如何按 varchar 类型字段的年份分区
问题描述
我正在学习postgresql,我有一个源文件,有一个varchar类型的字段,它的值是这样的:
20190625
20190626
20190627
20190628
20190629
20190630
现在我想按该字段的第一个字符进行分区,也就是说,按年份分区,
我试着这样做:
partition by range(substr(str, 1,4));
但是这样不行,我想按年分区,比如10年就10个分区,20年就20个分区,分区数不固定,怎么做?
解决方案
正如评论中提到的,date
本来是一种更好的数据类型,但是由于日期至少采用“年-月-日”的形式,因此列上的简单范围分区应该这样做:
CREATE TABLE data (...)
PARTITION BY RANGE (str);
CREATE TABLE data_2019
PARTITION OF data FOR VALUES FROM ('20190101') TO ('20200101');
这是因为在这种格式中,日期顺序、数字顺序和字符串顺序是相同的。
确保添加COLLATE "C"
到列定义以使字符串比较尽可能便宜。
我会添加一个检查约束来确定数据始终具有这种格式。
推荐阅读
- c++ - 当问题要求在 C++ 中以相反的顺序输入时如何显示用户输入字符串
- google-bigquery - 如何在不硬编码过滤条件的情况下在谷歌大查询中使用分区修剪?
- sas - SAS 将文本写入文本文件会导致额外的空格未写入 LOG 文件
- sql - 雪花从 XML 列中获取值
- r - Shiny 找不到包 RJSONIO
- python - Turtle onkeypress 功能不接受输入
- dataframe - names(x) <- value 中的错误:“names”属性必须与向量的长度相同——OpenML
- zapier - 在 Zapier 的代码中,如何将字段附加到常量 URL?
- arrays - 用 C 在特定内存位置声明二维整数数组
- r - 如何获得将对象分组的所有组合?