我有一个日期基准,用于衡量用户在我们系统中采取的每一步。
我想选择平台上的最后一步是:“ Resultado Idwall APROVADO”(mensagem列)的所有用户(usuarioId列)
这是一个比“ Resultado Idwall APROVADO”更进一步的用户示例。
我尝试使用:
select *
from usuarioAnalise
where 1=1
and mensagem = 'Resultado Idwall APROVADO'
and criacaoData=max(criacaoData)
group by usuarioId
由于我们有同一个用户的多个日志,因此尽管我应该将用户带到mensagem列为'Resultado Idwall APROVADO'的位置,但这是最后一个日志( criacaoData = max(criacaoData))
但是它给了我错误行: 除非聚集在HAVING子句或选择列表中包含的子查询中,并且聚集的列是外部引用,否则聚集可能不会出现在WHERE子句中。
答案 0 :(得分:1)
您可以使用窗口功能。
如果希望所有用户的最后一步是批准,则一个选项是使用row_number()
筛选每个组的最后一条记录,然后检查其是否具有预期状态:
select ua.*
from (
select ua.*,
row_number() over(partition by usuarioId order by criacaoData desc) rn
from usuarioAnalise ua
) ua
where rn = 1 and mensagem = 'Resultado Idwall APROVADO'
另一方面,如果您希望用户的所有行的最后一个动作是“ Approvado”,则可以使用窗口功能first_value()
:
select *
from (
select ua.*,
first_value(mensagem) over(partition by usuarioId order by criacaoData desc) first_mensagem
from usuarioAnalise ua
) ua
where first_mensagem = 'Resultado Idwall APROVADO'