创建 Top-K 投影
您可以使用以下语法定义一个 Top-K 投影:
CREATE PROJECTION proj-name [(proj-column-spec)]
AS SELECT select-expression FROM table
LIMIT num-rows OVER (PARTITION BY expression ORDER BY column-expr);
有关完整的语法选项,请参阅CREATE PROJECTION。
例如:
=> CREATE PROJECTION readings_topk (meter_id, recent_date, recent_value)
AS SELECT meter_id, reading_date, reading_value FROM readings
LIMIT 5 OVER (PARTITION BY meter_id ORDER BY reading_date DESC);
有关详细讨论,请参阅Top-K 投影示例。
要求
以下要求适用于 Top-K 投影:
-
投影不能未分段。
-
窗口分区子句必须使用
PARTITION BY
。 -
PARTITION BY
和ORDER BY
子句中的列必须是SELECT
列表中指定的第一个列。 -
您必须使用
LIMIT
选项来创建 Top-K 投影,而不是使用子查询。例如,以下SELECT
语句是等效的:=> SELECT symbol, trade_time last_trade, price last_price FROM ( SELECT symbol, trade_time, price, ROW_NUMBER() OVER(PARTITION BY symbol ORDER BY trade_time DESC) rn FROM trades) trds WHERE rn <=1; => SELECT symbol, trade_time last_trade, price last_price FROM trades LIMIT 1 OVER(PARTITION BY symbol ORDER BY trade_time DESC);
两个语句返回了相同的结果:
symbol | last_trade | last_price ------------------+-----------------------+------------ AAPL | 2011-11-10 10:10:20.5 | 108.4000 HPQ | 2012-10-10 10:10:10.4 | 42.0500 (2 rows)
预聚合数据以供两个查询使用的 Top-K 投影必须包括
LIMIT
选项:=> CREATE PROJECTION trades_topk AS SELECT symbol, trade_time last_trade, price last_price FROM trades LIMIT 1 OVER(PARTITION BY symbol ORDER BY trade_time DESC);
限制
以下限制适用于 Top-K 投影:
-
Top-K 投影只能引用一个表。
-
Vertica 不会将 Top-K 投影视为超投影,即使是包含所有表格列的投影也是如此。
-
您不能修改 Top-K 投影中包含的列的锚表元数据,例如列的数据类型或默认值。您也不能删除这些列。要进行这些更改,首先删除与表关联的所有实时聚合和 Top-K 投影。
注意
一个例外情况是:您可以在实时聚合投影包含的列中设置和删除 NOT NULL。