如何在 sql 的 where 列中使用新创建的列?

How to use new created column in where column in sql?

您好,我有一个如下所示的查询:

                SELECT device_id, tag_id, at, _deleted, data, 
                row_number() OVER (PARTITION BY device_id ORDER BY at DESC) AS row_num
                FROM mdb_history.devices_tags_mapping_history
                WHERE at <= '2019-04-01' 
                AND _deleted = False
                AND (tag_id = '275674' or tag_id = '275673')
                AND row_num = 1

然而,当我 运行 以下查询时,出现以下错误:

ERROR:  column "row_num" does not exist

有什么办法可以解决这个问题。我尝试的一种方法是按以下方式使用它:

SELECT * from (SELECT device_id, tag_id, at, _deleted, data, 
                        row_number() OVER (PARTITION BY device_id ORDER BY at DESC) AS row_num
                        FROM mdb_history.devices_tags_mapping_history  
                        WHERE at <= '2019-04-01' 
                        AND _deleted = False
                        AND (tag_id = '275674' or tag_id = '275673')) tag_deleted 
                WHERE tag_deleted.row_num = 1

但这变得太复杂了,因为我对其他查询执行此操作,因为我有多个连接,并且我必须 select 中所述的列,因此它会导致很多 select 语句。任何以更简单的方式做到这一点的聪明方法。谢谢

您不能在查询中引用您在 select 同一级别定义的 row_num 别名。因此,您在这里的主要选择是子查询,其中 row_num 可用。但是,Postgres 实际上可以选择以另一种方式获得你想要的东西。您可以在此处使用 DISTINCT ON

SELECT DISTINCT ON (device_id), device_id, tag_id, at, _deleted, data
FROM mdb_history.devices_tags_mapping_history
WHERE
    at <= '2019-04-01' AND
    _deleted = false AND
    tag_id IN ('275674', '275673')
ORDER BY
    device_id,
    at DESC;

评论太长/格式太长。 @TimBiegeleisen 声明 "alias which you defined in the same level of the select" 背后是有原因的。原因是所有 SQL 语句都遵循相同的 sequence for evaluation。不幸的是,该顺序不遵循语句表示中子句的顺序。该序列是有序的:

  1. 来自
  2. 哪里
  3. 分组依据
  4. select
  5. 限制

您会注意到,在对 where 子句求值之后,实际得到 selected 的结果很好。由于您的别名是在 select 阶段定义的,因此在 where 阶段不存在。