我无法使用 ecto 的 `over/2` 函数在 window 中添加特定的 frame_clause

I cannot add a specific frame_clause in a window using ecto's `over/2` function

我使用 ecto 来查询 Postgres 数据库,我需要添加一个 Window 函数来保持累计和。这工作正常,除了有问题的 "amount" 的重复值,它们被加在一起以获得累积和。在原始 sql 中,解决方案是添加自定义框架子句 (ROWS UNBOUNDED PRECEDING),但没有明显的方法可以使用查询 DSL 直接添加它。

在我们的数据库中,我们有多种产品,其中大部分产品获得多个评级和金额。我需要确定所有评级的总和,以及特定子集中金额的累计总和(与问题无关,仅用于某些上下文)。当前查询的一个例子是:

 from(p in Product,
      left_join: ratings in assoc(p, :ratings),
      select: [
        p.id,
        sum(ratings.amount),
        sum(sum(ratings.amount))
        |> over(
          partition_by: p.selection_0,
          order_by: sum(ratings.amount)
        )
      ],
      group_by: p.id
    )

正如我所说,除了总量相等的产品外,这很好用。这是意料之中的,因为它在原始 postgresql 中的工作方式与此问题中的询问和回答相同:Duplicate lines with postgres window functions

我找不到将 frame_clause 添加到使用 over/2 函数创建的 window 的明显方法。我考虑过使用片段,但期望使用不适用于 frame_clause 的键列表符号(例如 where: fragment("..."))。

看起来你在 Elixir Forums 上得到了答案:

from(p in Product,
  left_join: ratings in assoc(p, :ratings),
  select: [
    p.id,
    sum(ratings.amount),
    over(sum(sum(ratings.amount)), :w1)
  ],
  windows: [
    w1: [
      partition_by: p.selection_0,
      order_by: sum(ratings.amount),
      frame: fragment("rows unbounded preceding")
    ]
  ],
  group_by: p.id
)

供参考:https://hexdocs.pm/ecto/Ecto.Query.html#windows/3-frame