如何在 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。不幸的是,该顺序不遵循语句表示中子句的顺序。该序列是有序的:
- 来自
- 哪里
- 分组依据
- 有
- select
- 限制
您会注意到,在对 where 子句求值之后,实际得到 selected 的结果很好。由于您的别名是在 select 阶段定义的,因此在 where 阶段不存在。
您好,我有一个如下所示的查询:
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。不幸的是,该顺序不遵循语句表示中子句的顺序。该序列是有序的:
- 来自
- 哪里
- 分组依据
- 有
- select
- 限制
您会注意到,在对 where 子句求值之后,实际得到 selected 的结果很好。由于您的别名是在 select 阶段定义的,因此在 where 阶段不存在。