需要分组帮助

时间:2020-09-30 19:52:26

标签: sql datetime group-by greatest-n-per-group window-functions

我有一个日期基准,用于衡量用户在我们系统中采取的每一步。

我想选择平台上的最后一步是:“ Resultado Idwall APROVADO”(mensagem列)的所有用户(usuarioId列)

这是一个比“ Resultado Idwall APROVADO”更进一步的用户示例。

User Exaples

我尝试使用:

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子句中。

1 个答案:

答案 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'