ecto를 사용하여 Postgres 데이터베이스를 쿼리하고 누적 합계를 유지하기 위해 Window 함수를 추가해야합니다. 이것은 문제의 "금액"의 중복 값을 제외하고는 잘 작동하며 누적 합계를 위해 함께 추가됩니다. 원시 SQL에서 해결책은 사용자 정의 프레임 절 ( ROWS UNBOUNDED PRECEDING
) 을 추가하는 것이지만 쿼리 DSL을 사용하여 ecto에이를 추가하는 명확한 방법은 없습니다.
우리 데이터베이스에는 여러 제품이 있으며 대부분은 금액으로 여러 등급을받습니다. 모든 등급의 합계뿐만 아니라 특정 하위 집합 내 금액의 누적 합계도 결정해야합니다 (문제와 관련이 없으며 일부 상황에서만). 현재 쿼리의 예는 다음과 같습니다.
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에서 동일하게 작동하므로 예상됩니다. postgres 창 기능이있는 중복 줄
over/2
함수를 사용하여 만든 창에 frame_clause를 추가하는 확실한 방법을 찾을 수 없습니다 . 프래그먼트 사용에 대해 생각했지만 where: fragment("...")
frame_clause에 적용 할 수없는 키 리스트 표기법 (예 :)이 예상됩니다.
Elixir 포럼 에서 답변을받은 것 같습니다.
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다