我无法使用 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
)
我使用 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
)