2017-12-06 13 views
2

私は2つのテーブル:orderscontragentsを持っています。それぞれの対立は、多くの命令を持つかもしれません。各注文にはorder_dateがあります。私はそれぞれの対立するものの最初の注文日を取っておきたいが、注意書きを書いておく:180日以上の注文間にギャップがあれば、ギャップの前にそれらを「忘れる」必要がある(そしてギャップを考慮した最初の注文。「最初の」このためPostgresql:JOINでWITHサブクエリを使用する方法

、私は、次のステートメントを実装しました:

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 

これは私が必要なものであるコードcode、とcontragentのために返される単一の値になり

しかし私はできませんどのようにこの日付を返すだろう選択を実行する方法を理解するfまたはテーブル内のすべての矛盾!

唯一の方法は、CREATE FUNCTIONを使用していましたが、実際にはそれを行うことができないため、アドバイスをいただきありがとうございます。

答えて

1

partition byを追加したいと思います。これはの場合は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 
関連する問題