我想重构我的查询以使用子查询作为函数参数。
原始查询如下所示,工作正常:
SELECT date_trunc('hour', (SELECT timestamp FROM data ORDER BY timestamp DESC LIMIT 1));
我想知道是否可以重构查询以将别名值作为参数传递,而不是上面显示的SELECT
语句。
我试图想出这样的东西,但没有运气:
WITH ts_query AS (
SELECT "timestamp" FROM "data" ORDER BY "timestamp" DESC LIMIT 1
)
SELECT date_trunc('hour', ts_query);
当我收到以下错误时:
ERROR: column "ts_query" does not exist
这是你想要的吗?
WITH ts_query AS (
SELECT "timestamp"
FROM "data"
ORDER BY "timestamp" DESC
LIMIT 1
)
SELECT date_trunc('hour', "timestamp")
FROM ts_query;
换句话说,ts_query
替换后续查询中的表而不是列。
在更复杂的查询中,可以使用:
SELECT date_trunc('hour', t1."timestamp")
FROM ts_query tq CROSS JOIN
. . . -- more query logic here
我在要参数化的查询中执行此操作,具有包含查询其余部分中使用的参数的 CTE(称为params
(。
如果您知道CTE 只有一行,则可以将其用作标量子查询:
SELECT date_trunc('hour', (SELECT "timestamp" FROM ts_query) )
如果 CTE 具有多行,则会生成运行时错误。