0

嗨,我有一个查询,如下所示:

                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

但这变得太复杂了,因为我对其他查询执行此操作,因为我有连接数,并且我必须按照说明选择列,因此它会导致很多选择语句。以更简单的方式做到这一点的任何智能方式。谢谢

4

2 回答 2

1

您不能引用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;
于 2020-03-17T17:01:26.760 回答
0

太长/格式化的评论。@TimBiegeleisen 声明“您在同一级别的选择中定义的别名”背后有一个原因。原因是所有 SQL 语句都遵循相同的求值顺序。不幸的是,该顺序不遵循语句演示中的子句顺序。该顺序是有序的:

  1. 在哪里
  2. 通过...分组
  3. 选择
  4. 限制

您会注意到,在评估 where 子句之后,实际选择的内容很好。由于您的别名是在 select 阶段定义的,因此它在 where 阶段不存在。

于 2020-03-17T20:23:11.133 回答