Sql Postgres:传递行值以选择子查询

Sql Postgres:传递行值以选择子查询,sql,postgresql,group-by,subquery,Sql,Postgresql,Group By,Subquery,问题是要获取状态为“404未找到”的每天的结果百分比 查询结果 与2016-07-17硬编码不同,我希望在外部查询中传递day的值,即L.day 像这样: SELECT CAST(time AS DATE) as day, status, count(*), count(*) * 100.0 / ( SELECT count(*)FROM log GROUP BY CAST(time AS DATE) HAV

问题是要获取状态为“404未找到”的每天的结果百分比

查询结果

与2016-07-17硬编码不同,我希望在外部查询中传递day的值,即L.day

像这样:

SELECT CAST(time AS DATE) as day, status, count(*),
        count(*) * 100.0 / (
            SELECT count(*)FROM log
            GROUP BY CAST(time AS DATE)
            HAVING CAST(time AS DATE) = L.day
        ) as percent 
FROM log L
GROUP BY day, status
HAVING status = '404 NOT FOUND'
ORDER BY percent DESC
这给

更新:基于评论


相同的结果。

您不能在定义别名的同一级别访问别名,您需要使用=castl.time作为日期

但那个having条款并没有真正意义——至少对我来说是这样

我想你想要的是:

SELECT CAST(time AS DATE) as day, 
       status, 
       count(*),
       count(*) * 100.0 / (SELECT count(*)
                           FROM log l2
                           where cast(l2.time as date) = CAST(l.time AS DATE)) as percent 
FROM log L
GROUP BY day, status
HAVING status = '404 NOT FOUND'
ORDER BY percent DESC;

在线示例:

对!我看到的子查询通道视图中不需要组/拥有。但我得到了一个错误:子查询使用来自外部查询的未分组列l.time。这可能是我的Postgres版本或客户的问题吗?Postico@JoshuaAzemoh:可能是一个版本的东西。9.6汉克斯组的行为发生了很大变化!我会查的。
SELECT CAST(time AS DATE) as day, status, count(*),
        count(*) * 100.0 / (
            SELECT count(*)FROM log
            GROUP BY CAST(time AS DATE)
            HAVING CAST(time AS DATE) = L.day
        ) as percent 
FROM log L
GROUP BY day, status
HAVING status = '404 NOT FOUND'
ORDER BY percent DESC
ERROR:  column l.day does not exist
LINE 5:    HAVING CAST(time AS DATE) = L.day
                                       ^
SELECT CAST(time AS DATE) as day, status, count(*),
        count(*) * 100.0 / (
            SELECT count(*) FROM log
            WHERE CAST(time AS DATE) = '2016-07-17'
        ) as percent 
FROM log L
GROUP BY day, status
HAVING status = '404 NOT FOUND'
ORDER BY percent DESC
SELECT CAST(time AS DATE) as day, 
       status, 
       count(*),
       count(*) * 100.0 / (SELECT count(*)
                           FROM log l2
                           where cast(l2.time as date) = CAST(l.time AS DATE)) as percent 
FROM log L
GROUP BY day, status
HAVING status = '404 NOT FOUND'
ORDER BY percent DESC;