我希望将当前行的值与前面行的值进行比较。我想出了这个,但行不通。它找不到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规则,而不是由于您正在使用的数据库。
https://stackoverflow.com/questions/66098800
复制相似问题