从两个表中获取匹配数据,其中日期与日期范围postgres进行比较

时间:2017-07-12 13:20:47

标签: postgresql dynamic date-range cartesian-product

我有' order_history'和' current_order'表格都有类似的列,如下所述: order_name,Consumer_name,order_date,Order_ amount

每次我收到新订单,我必须找出重叠的订单,并从历史表中删除这些重复,然后附加current_table数据,但现在这是最糟糕的,因为我的日期在当前表中被更改所以我必须考虑+ / - 比较order_date 14天,然后从历史表中删除它 请参见样品表数据

---当前订单
ORDER_NAME | CONSUMER_NAME | order_date的| ORDER_AMOUNT
羊毛| Jhon | 2017年6月15日| 500个
羊毛| Jhon | 2017年7月14日| 1000
羊毛| Jhon | 2017年8月13日| 800个

---订单历史
ORDER_NAME | CONSUMER_NAME | order_date | ORDER_AMOUNT
羊毛| Jhon | 5/15/2017 | 1200
羊毛| Jhon | 6/10/2017 | 500个
羊毛| Jhon | 7/8/2017 | 800

在上面的场景中,我需要从历史表中删除6月和7月(2010年6月10日和7月8日)的订单行,然后需要将当前订单表条目附加到历史表中。

我正在使用以下查询

select a.order_name, a.consumer_name, a.order_date , a.order_amount 
from  order_history a inner join current_order b 
on ( upper(a.order_name) = upper(b.order_name) and  
upper(a.consumer_name) = upper(b.consumer_name))
where
upper(a.order_name) = upper(b.order_name) and  
upper(a.consumer_name) = upper(b.consumer_name)
and  a.order_date -b.order_date <= 14 and a.order_date -b.order_date >= -14

但我得到重复的行

你可以帮我解决这个问题吗?一个解决方案可以是笛卡尔积,其中每一行将与另一个表的所有行进行比较,但由于数据大小为百万行,此查询将花费大量时间

1 个答案:

答案 0 :(得分:0)

使用ABS将日期之间的差异作为正数。如果您只想从历史记录表中删除,请使用EXISTS查找当前订单表。

delete
from order_history h
where exists
(
  select *
  from current_order c
  where c.order_name = h.order_name
    and c.consumer_name = h.consumer_name
    and abs(c.order_date - h.order_date) <= 14
);