我有一个雪花桌,如下所示。我想按列 FILENAME 和 ROW_NUM 对表进行排序,并将顺序保存在表中。
create OR REPLACE table TEST (
ID VARCHAR,
FILENAME VARCHAR,
ROW_NUM NUMBER
);
INSERT INTO TEST values ('1', 'abc', 2);
INSERT INTO TEST values ('2', 'abc', 3);
INSERT INTO TEST values ('3', 'abc', 1);
INSERT INTO TEST values ('4', 'xyz', 2);
INSERT INTO TEST values ('5', 'cbc', 1);
INSERT INTO TEST values ('6', 'xyz', 1);
我可以使用下面的查询来显示排序后的数据,但是如何在不创建任何新表的情况下将排序后的数据保存在数据库中?
select * from TEST order by FILENAME, ROW_NUM;
这个答案使用创建,但不创建一个new表,这正是我点击这个问题所寻找的。
TL;博士:
create OR REPLACE table TEST_TABLE as
select * from TEST_TABLE order by FILENAME, ID
长解释:
如果您不想使用集群(例如其他解决方案),请使用此选项,这将导致表上的持续成本,因为集群操作将继续在后台运行以不断保持表排序。
如果不需要并且只需要单个排序操作,您可以使用以下示例。
注意,如果这是一个大表,请提前规划并选择适合数据大小的仓库。否则,数据将写入本地磁盘甚至存储,您最终将支付更多费用。
另一个重要提示:这将重新创建所有分区,您将需要为保留期+故障安全支付该存储费用。
我不知道使用集群然后禁用它是否比使用这种方法更便宜。
完整示例:
create OR REPLACE table TEST_TABLE (
ID VARCHAR,
FILENAME VARCHAR,
ROW_NUM NUMBER
);
INSERT INTO TEST_TABLE values ('1', 'abc', 2);
INSERT INTO TEST_TABLE values ('2', 'abc', 3);
INSERT INTO TEST_TABLE values ('3', 'abc', 1);
INSERT INTO TEST_TABLE values ('4', 'xyz', 2);
INSERT INTO TEST_TABLE values ('5', 'cbc', 1);
INSERT INTO TEST_TABLE values ('6', 'xyz', 1);
INSERT INTO TEST_TABLE values ('7', 'abc', 3);
INSERT INTO TEST_TABLE values ('8', 'abc', 1);
select * from TEST_TABLE;
create OR REPLACE table TEST_TABLE as
select * from TEST_TABLE order by FILENAME, ID
编辑:另一个答案更好,因为数据可以在创建时进行排序(无需聚类):https://stackoverflow.com/a/74667138/132438
--
以前:
在 SQL 中,数据没有固有的顺序,但有一种方法可以要求对数据进行物理排序以供将来使用:
CLUSTER BY
。
如果表已创建:
alter table t1 cluster by (FILENAME, ROW_NUM);