首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能在WHERE子句中使用我的列别名?

为什么我不能在WHERE子句中使用我的列别名?
EN

Stack Overflow用户
提问于 2021-02-08 09:18:39
回答 4查看 180关注 0票数 0

我希望将当前行的值与前面行的值进行比较。我想出了这个,但行不通。它找不到PREV_NUMBER_OF_PEOPLE,所以我的WHERE子句无效。我不允许使用WITH。有谁有主意吗?

代码语言:javascript
复制
SELECT
   ID
   ,NUMBER_OF_PEOPLE 
   ,LAG(NUMBER_OF_PEOPLE) OVER (ORDER BY DATE) AS PREV_NUMBER_OF_PEOPLE
   ,DATE 
FROM (
   SELECT * FROM DATAFRAME
   WHERE DATE>=CURRENT_DATE-90
   ORDER BY DATE DESC
) AS InnerQuery
WHERE NUMBER_OF_PEOPLE <> PREV_NUMBER_OF_PEOPLE 
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-02-08 12:25:47

您的查询有几个问题:

  • 过滤条件应该在外部查询中。
  • 新列定义应该在内部查询中。
  • order by应该在外部查询中。

通过这些更改,它应该可以很好地工作:

代码语言:javascript
复制
SELECT ID, NUMBER_OF_PEOPLE, PREV_NUMBER_OF_PEOPLE, DATE
FROM (SELECT D.*,
             LAG(NUMBER_OF_PEOPLE) OVER (ORDER BY DATE) AS PREV_NUMBER_OF_PEOPLE
      FROM DATAFRAME D
     ) AS InnerQuery
WHERE NUMBER_OF_PEOPLE <> PREV_NUMBER_OF_PEOPLE AND
      DATE >= CURRENT_DATE - 90
ORDER BY DATE DESC;

您需要在LAG()之后进行过滤,以便在日期范围内包括最早的一天。如果在内部查询中进行筛选,则LAG()将在这种情况下返回NULL

您需要在子查询中定义别名,以便在WHERE中引用它。在SELECT中定义的别名不能在相应的WHERE中使用。这是一个SQL规则,而不是由于您正在使用的数据库。

票数 0
EN

Stack Overflow用户

发布于 2021-02-08 09:27:05

您可以使用公共表表达式(CTE)来拆分查询处理。

就像这样:

代码语言:javascript
复制
WITH cte1 AS
(
  SELECT * -- field list is advised...
  FROM DATAFRAME
  WHERE DATE >= CURRENT_DATE-90
),
cte2 AS
(
  SELECT ID
        ,NUMBER_OF_PEOPLE 
        ,LAG(NUMBER_OF_PEOPLE) OVER (ORDER BY DATE) AS PREV_NUMBER_OF_PEOPLE
        ,DATE 
  FROM cte1
)
SELECT ID
      ,NUMBER_OF_PEOPLE 
      ,PREV_NUMBER_OF_PEOPLE
      ,DATE 
FROM cte2
WHERE NUMBER_OF_PEOPLE <> PREV_NUMBER_OF_PEOPLE
ORDER BY DATE DESC;
票数 0
EN

Stack Overflow用户

发布于 2021-02-08 09:28:38

逻辑查询处理是对定义正确结果的查询的概念性解释,与关键字顺序的查询子句不同,它从计算FROM子句开始。理解逻辑查询处理是正确理解T的关键.

用于检索T中数据的主语句是SELECT语句.以下是按您应该键入的顺序指定的主要查询子句(称为“”):

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER (

)

但如前所述,逻辑查询处理顺序,即概念解释顺序,是不同的。它从FROM子句开始。以下是六个主要查询子句的逻辑查询处理顺序:

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • ORDER (

)

您可以使用CTE:

代码语言:javascript
复制
  WITH CTE1 AS (
SELECT * FROM DATAFRAME
       WHERE DATE>=CURRENT_DATE-90
       
),
CTE2 AS (
SELECT
       ID
       ,NUMBER_OF_PEOPLE 
       ,LAG(NUMBER_OF_PEOPLE) OVER (ORDER BY DATE) AS PREV_NUMBER_OF_PEOPLE
       ,DATE 
    FROM CT2
)

SELECT * FROM CT2
WHERE NUMBER_OF_PEOPLE <> PREV_NUMBER_OF_PEOPLE
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66098800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档