我试图在源表上创建一个视图,然后从视图中选择特定时间戳范围的数据并将其放入target表中。
我们有一个源表:
100万行被推送到源表中,对应于1月1日到1月31日的数据。
CREATE TABLE IF NOT EXISTS source(
CELL String,
TIMESTAMP DateTime,
COUNTER1 Float32,
COUNTER2 Float32,
COUNTER3 Float32,
COUNTER4 Float32,
COUNTER5 Float32,
COUNTER6 Float32,
InsertionTime DateTime DEFAULT now(), /* Insertion Time */
QHour DateTime DEFAULT toStartOfFifteenMinutes(TIMESTAMP)
) ENGINE=ReplacingMergeTree()
PARTITION BY toYYYYMM(TIMESTAMP)
ORDER BY (QHour, TIMESTAMP, CELL)
SETTINGS index_granularity = 31768
现在,我们在源表上创建了一个视图。
CREATE VIEW IF NOT EXISTS myView
AS SELECT
CELL,
QHour,
toStartOfFifteenMinutes(TIMESTAMP) AS ViewQHour,
100 * sum(COUNTER1) / sum(COUNTER2) AS KPI1
FROM (
SELECT
CELL,
TIMESTAMP,
any(QHour) as QHour
argMax(COUNTER1, InsertionTime) AS COUNTER1,
argMax(COUNTER2, InsertionTime) AS COUNTER2
FROM ThreeGCell
GROUP BY TIMESTAMP, CELL, QHour)
GROUP BY ViewQHour, CELL
ORDER BY ViewQHour, CELL
现在,在视图上,我需要从视图中选择一个时间段的数据:1月1日到1月10日。
SELECT *
FROM myView
WHERE QHour >= toDateTime('2020-01-01 00:00:00') AND QHour <= toDateTime('2020-01-10 00:00:00')
但是视图上的select查询将所有100万行添加到目标表中,该表是整个1月的数据,而我只查找1月1日到1月10日的特定期间的数据。
我有以下问题:
我们可以修改视图上的查询以只处理特定的时间段吗?
我们能否在源表中动态推送的最新数据集上生成一个视图?我的意思是我们只有来自源表的过滤数据集,并且在视图中使用过滤数据?是否可以修改这些过滤器以使用不同的时间范围?例如,视图中有1月1日到1月10日的数据。在第二轮中,我们得到了从1月11日到1月20日的数据。
1条答案
按热度按时间djmepvbi1#
大多数数据库都禁止使用创建视图
ORDER BY
不幸的是,他没有。在最初的设计中,允许创建这样的视图是一个错误。ORDER BY
取消 predicate 下推,因为它在某些情况下会破坏结果(优化器仍然很弱,无法理解runningdiff()和neighbor()的情况)。https://github.com/clickhouse/clickhouse/issues/9425#issuecomment-592658368