【问题标题】:Grouping help needed需要分组帮助
【发布时间】:2021-01-16 13:13:57
【问题描述】:

我有一个数据库,用于衡量用户在我们系统中执行的每一步。

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

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

我尝试使用:

select *
from usuarioAnalise
where 1=1
and mensagem = 'Resultado Idwall APROVADO'
and criacaoData=max(criacaoData)
group by usuarioId

由于我们为同一个用户有多个日志,我认为我应该将用户列在“Resultado Idwall APROVADO”的位置,这是最后一个日志 (criacaoData=max(criacaoData) )

但它给了我错误行: 聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且被聚合的列是外部引用。

【问题讨论】:

  • 您通常 GROUP BY 与您 SELECT 相同的列,除了那些是设置函数的参数的列。
  • and criacaoData = (select max(criacaoData) ...
  • 这里的大多数人希望样本表数据和预期结果为格式化文本,而不是图像。 (而且我看不懂那个微小的图像文本。)

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


【解决方案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'

另一方面,如果你想要所有行最后一个操作是“批准”的用户,那么你可以使用窗口函数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'

【讨论】:

  • 这让我“在 row_number() 附近有错误的 Sintax
  • @MatheusBarreto:你在运行哪个数据库:mysql、oracle、sqlserver...?
  • 我正在使用 Azure Data Studio
  • @MatheusBarreto:好的,所以 SQL Server 可能是您的数据库。查询应该可以工作。我刚刚修正了第一个查询中的错字(缺少逗号)。
  • 然而,它向我抛出了错误消息:无效的列名 'usuarioAnalise'。这里,usuarioAnalise 是数据库的名称
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多