Sql 使用check根据日期连接表

Sql 使用check根据日期连接表,sql,postgresql,Sql,Postgresql,我在PostgreSQL中有两个表: 零件的需求量: demandid partid demanddate quantity 40 125 01.01.17 10 41 125 05.01.17 30 42 123 20.06.17 10 orderid partid orderdate quantity

我在PostgreSQL中有两个表:

零件的需求量:

   demandid partid  demanddate        quantity 
    40       125     01.01.17          10
    41       125     05.01.17          30
    42       123     20.06.17          10
  orderid  partid orderdate        quantity 
   1        125     07.01.17     15
   54       125     10.06.17     25
   14       122     05.01.17     30
零件的订单:

   demandid partid  demanddate        quantity 
    40       125     01.01.17          10
    41       125     05.01.17          30
    42       123     20.06.17          10
  orderid  partid orderdate        quantity 
   1        125     07.01.17     15
   54       125     10.06.17     25
   14       122     05.01.17     30
基本上,零件的需求说明要买什么,零件的订单说明我们买了什么。我们可以购买未按需列出的零件

我需要一份报告,其中显示了我的所有零件在Demans_的零件和多少个星期过去了,因为最近的匹配行在订单_的零件。注意数量字段在这里是无关的

预期结果是(如果每个零件有多行显示旧零件):


我认为棘手的部分是每张桌子有一行。但这很容易在上使用
distinct。然后你需要计算月份。为此,您可以使用
age()

select dp.partid, dp.date,
       (extract(year from age(dp.date, op.date))*12 +
        extract(month from age(dp.date, op.date))
       ) as months
from (select distinct on (dp.partid) dp.*
      from demans_for_parts dp
      order by dp.partid, dp.date desc
     ) dp left join
     (select distinct on (op.partid) op.*
      from Orders_for_parts op
      order by op.partid, op.date desc
     ) op
     on dp.partid = op.partid;
你喜欢什么

with o as (
  select distinct partid, max(orderdate) over (partition by partid)
  from Orders_for_parts
)
, p as (
  select distinct partid, min(demanddate) over (partition by partid)
  from Demans_for_parts
)
select p.partid, min as demanddate, date_part('day',o.max - p.min)/7
from p
left outer join o on (p.partid = o.partid)
;

它每部分给我很多行。。。每个零件不得超过1行。在这种情况下,月数的含义是什么?我不明白为什么它显示负值。我想看到的是我们上次购买零件的几周过去了,也就是说,这几周过去了,因为我们的零件订单创下了最近(新)的记录part@user2641077 . .. 日期的顺序不对。谢谢,我还是有点麻烦。dp.commitdate描述不正确,应该是ASC,因为我想要最早的需求。。。更改后,我无法使年龄正常工作(以周值为单位)