我希望将当前行的值与前面行的值进行比较。我想出了这个,但行不通。它找不到PREV_NUMBER_OF_PEOPLE,所以我的WHERE子句无效。我不允许使用WITH。有谁有主意吗?
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 发布于 2021-02-08 12:25:47
您的查询有几个问题:
order by应该在外部查询中。通过这些更改,它应该可以很好地工作:
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规则,而不是由于您正在使用的数据库。
发布于 2021-02-08 09:27:05
您可以使用公共表表达式(CTE)来拆分查询处理。
就像这样:
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;发布于 2021-02-08 09:28:38
逻辑查询处理是对定义正确结果的查询的概念性解释,与关键字顺序的查询子句不同,它从计算FROM子句开始。理解逻辑查询处理是正确理解T的关键.
用于检索T中数据的主语句是SELECT语句.以下是按您应该键入的顺序指定的主要查询子句(称为“”):
)
但如前所述,逻辑查询处理顺序,即概念解释顺序,是不同的。它从FROM子句开始。以下是六个主要查询子句的逻辑查询处理顺序:
)
您可以使用CTE:
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_PEOPLEhttps://stackoverflow.com/questions/66098800
复制相似问题