sql - 在 PostgreSQL 的查询中的窗口函数中使用别名

标签 sql postgresql window-functions

我正在使用 PostgreSQL 9.1 版并查看 Postgres docs ,我知道可以执行以下操作:

SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary;

这适用于我的查询。

现在我需要能够在 OVER (ORDER BY ...) 中指定别名而不是列名?

我试过这个:

编辑:我之前忘记将 rank() 添加到此查询中:

SELECT salary, <complex expression> as result, rank() OVER (ORDER BY result) FROM empsalary;

我收到一条错误消息,提示 column "result"does not exist.

是否可以在这里指定别名而不是列名?我是否遗漏了一些特殊的语法?

编辑:

我正在使用 Hibernate,并为窗口函数使用了一些 native SQL。生成和执行的完整 SQL 如下:

select 
       rank() OVER (ORDER BY deltahdlcOverruns DESC) as rank, 

       this_.deviceNo as y1_, 

       (SELECT _dev_.hdlcOverruns FROM abstractperformancestatistic _abs_ 
        INNER JOIN enddevicestatistic _dev_ ON _dev_.id = _abs_.id 
        INNER JOIN linkstatistic _link_ ON _link_.id = _dev_.linkStatistic_id 
        INNER JOIN iptstatistic _ipt_ ON _ipt_.id = _link_.iptStat_id 
        WHERE this_.deviceNo=_dev_.deviceNo AND _abs_.dateTime <= '3910-06-07 00:00:00.0'
        ORDER BY _abs_.dateTime DESC LIMIT 1
       ) 
       - 
       (SELECT _dev_.hdlcOverruns FROM abstractperformancestatistic _abs_ 
        INNER JOIN enddevicestatistic _dev_ ON _dev_.id = _abs_.id 
        INNER JOIN linkstatistic _link_ ON _link_.id = _dev_.linkStatistic_id 
        INNER JOIN iptstatistic _ipt_ ON _ipt_.id = _link_.iptStat_id 
        WHERE this_.deviceNo=_dev_.deviceNo AND _abs_.dateTime >= '3870-06-01 00:00:00.0' 
        ORDER BY _abs_.dateTime LIMIT 1
       ) 
       AS deltahdlcOverruns from EndDeviceStatistic this_ 

       inner join AbstractPerformanceStatistic this_1_ on this_.id=this_1_.id 
       inner join AbstractEntity this_2_ on this_.id=this_2_.id 
       left outer join RawEndDeviceStatistic this_3_ on this_.id=this_3_.id 
       left outer join LinkStatistic l2_ on this_.linkStatistic_id=l2_.id 
       left outer join AbstractPerformanceStatistic l2_1_ on l2_.id=l2_1_.id 
       left outer join AbstractEntity l2_2_ on l2_.id=l2_2_.id 
       left outer join RawLinkStatistic l2_3_ on l2_.id=l2_3_.id 
       left outer join IPTStatistic i1_ on l2_.iptStat_id=i1_.id 
       left outer join AbstractPerformanceStatistic i1_1_ on i1_.id=i1_1_.id 
       left outer join AbstractEntity i1_2_ on i1_.id=i1_2_.id 
       left outer join RawIPTStatistic i1_3_ on i1_.id=i1_3_.id 

       where this_1_.dateTime between ? and ? 

       group by this_.deviceNo limit ?

最佳答案

将别名放在 OVER 子句之后:

SELECT salary
     , sum(salary) OVER (ORDER BY salary) <b>AS my_alias</b>
FROM   empsalary;

问题更新后编辑

您不能在 SELECT 的同一级别引用列别名(“输出列”)。您需要一个子选择或一个 CTE为了这。喜欢:

SELECT id, result, rank() OVER (ORDER BY result) AS rnk
FROM  (
    SELECT id, <complex expression> AS result
    FROM   tbl
    WHERE  <some condition>
    GROUP  BY id
    ) sub;

对于您的查询:

SELECT rank() OVER (ORDER BY deltahdlcOverruns) AS rnk
     , y1_
     , deltahdlcOverruns
FROM  (
    SELECT this_.deviceNo as y1_
        ,  (SELECT _dev_.hdlcOverruns FROM abstractperformancestatistic _abs_ 
            JOIN   enddevicestatistic _dev_ USING (id)
            JOIN   linkstatistic _link_ ON _link_.id = _dev_.linkStatistic_id 
            JOIN   iptstatistic _ipt_ ON _ipt_.id = _link_.iptStat_id 
            WHERE  this_.deviceNo=_dev_.deviceNo
            AND    _abs_.dateTime <= '3910-06-07 00:00:00.0'
            ORDER  BY _abs_.dateTime DESC
            LIMIT  1
           ) 
           - 
           (SELECT _dev_.hdlcOverruns FROM abstractperformancestatistic _abs_ 
            JOIN   enddevicestatistic _dev_ USING (id)
            JOIN   linkstatistic _link_ ON _link_.id = _dev_.linkStatistic_id 
            JOIN   iptstatistic _ipt_ ON _ipt_.id = _link_.iptStat_id 
            WHERE  this_.deviceNo=_dev_.deviceNo
            AND    _abs_.dateTime >= '3870-06-01 00:00:00.0' 
            ORDER  BY _abs_.dateTime
            LIMIT  1
           ) AS deltahdlcOverruns
    FROM   EndDeviceStatistic this_ 
    JOIN   AbstractPerformanceStatistic this_1_ USING (id)
    JOIN   AbstractEntity this_2_ USING (id)
    LEFT   JOIN RawEndDeviceStatistic this_3_ USING (id)
    LEFT   JOIN LinkStatistic l2_ ON this_.linkStatistic_id = l2_.id 
    LEFT   JOIN AbstractPerformanceStatistic l2_1_ ON l2_.id = l2_1_.id 
    LEFT   JOIN AbstractEntity l2_2_ ON l2_.id = l2_2_.id 
    LEFT   JOIN RawLinkStatistic l2_3_ ON l2_.id = l2_3_.id 
    LEFT   JOIN IPTStatistic i1_ ON l2_.iptStat_id = i1_.id 
    LEFT   JOIN AbstractPerformanceStatistic i1_1_ ON i1_.id = i1_1_.id 
    LEFT   JOIN AbstractEntity i1_2_ ON i1_.id = i1_2_.id 
    LEFT   JOIN RawIPTStatistic i1_3_ ON i1_.id = i1_3_.id 
    WHERE  this_1_.dateTime between ? and ? 
    GROUP  BY this_.deviceNo
    LIMIT  ?
) x;

我做了一些额外的语法简化

关于sql - 在 PostgreSQL 的查询中的窗口函数中使用别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915303/

相关文章:

mysql - 如何检测MySQL表窗口中是否包含特定值

sql - PostgreSQL:运行查询的行数 'by minute'

sql - 对多列进行 DISTINCT 计数

sql - 用标识列重新插入行

json - Postgres 函数返回一行作为 JSON 值

sql - 错误 : there is no unique constraint matching given keys for referenced table "users"

mysql - 在计算用户变量之前,使用 FORCE INDEX 确保表按 GROUP BY 和 ORDER BY 排序

sql - 多次更新替换以使代码看起来正确

python - Web2py - 使用单独的 SQL 数据库进行归档时的键/约束问题

database - Perl 中的表游标