2017-12-06 14 views
2

2 테이블 : orderscontragents이 있습니다. 각 contragent에는 많은 주문이있을 수 있습니다. 각 주문에는 order_date이 있습니다. 나는 각각의 모순점에 대한 첫 주문 날짜를 원하지만,주의 사항이 있습니다 : 주문이 180 일 이상 차이가 나는 경우, 그 것을 갭 이전에 "잊어 버려야"합니다 (따라서 갭이 고려 된 첫 번째 주문이 고려됩니다). ..Postgresql : WITH 하위 쿼리를 JOIN과 함께 사용하는 방법

이 내가 필요로 무엇 코드 code 가진 contragent에 대해 반환되는 단일 값 결과
with o1 as (
    select order_date, lag(order_date) over(order by order_date ASC) as prev_order_date 
    from orders o 
    where o.contragent_code = :code 
    order by order_date desc) 
select o1.date_debts from o1 
where extract(day from o1.order_date-o1.prev_order_date)>=180 or o1.prev_order_date is null 
order by order_date desc 
limit 1 

: "첫 번째"이를 위해

, 나는 다음과 같은 성명을 구현했습니다

하지만 이 날짜를 반환하는 select 실행 방법을 알아낼 수 없습니다. f 또는 테이블의 모든 contragent!

내가 할 수 있었던 유일한 방법은 CREATE FUNCTION 이었지만, 프로덕션에서는 할 수 없었습니다. 어떤 조언도 매우 높이 평가됩니다!

답변

1

partition by을 추가하고 싶은데 over의 경우 group by과 같아야합니다.

with o1 as (
    select order_date, lag(order_date) over(partition by contragent_code order by order_date ASC) as prev_order_date 
    from orders o 
    order by order_date desc) 
select o1.date_debts from o1 
where extract(day from o1.order_date-o1.prev_order_date)>=180 or o1.prev_order_date is null 
order by order_date desc 

지금 lag는 같은 contragent_code와 행의 이전 ORDER_DATE을 찾습니다.

업데이트 : 마지막에는 정확하게 충분하지 않은 것처럼 보입니다. 최종 문 :

with s as (
    select o.contragent_code, o.order_date, 
     case 
     when 
      extract(day from order_date-lag(order_date) over(partition by contragent_code order by order_date asc))>=180 
     then o.order_date else null 
     end as date_with_gap 
    from orders o 
) select contragent_code, coalesce(max(date_with_gap), min(order_date)) from s 
group by contragent_code