SQL:从多个表中查找最长的日期差距

时间:2018-06-07 14:00:41

标签: sql postgresql

我需要一些帮助。 我有两张这样的桌子。

表人

gradle help --task <task>

表顺序

p_id | name | registration date
-----------------------------
 1   | ABC  |     2018-01-01
 2   | DEF  |     2018-02-02
 3   | GHI  |     2018-03-01
 4   | JKL  |     2018-01-02
 5   | MNO  |     2018-02-01
 6   | PQR  |     2018-03-02

我需要知道这两个表没有更新的最长时间是多少天。

在SQL中获取结果的最简单查询是什么?

谢谢

更新: 结果应显示order_date和registration_date之间的最长日期差距。由于最长的日期差距是2018-01-08和2018-02-01,因此结果应该返回'24'

4 个答案:

答案 0 :(得分:1)

假设当前的PostgreSQL和平均每人的大量订单,这应该是最快的选择之一:

SELECT o.order_date - p.registration_date AS days
FROM   person p
CROSS  JOIN LATERAL (
   SELECT order_date 
   FROM   "order"     -- order is a reserved word!
   WHRE   p_id = p.p_id
   ORDER  BY 1 DESC   -- assuming NOT NULL
   LIMIT  1
   ) o
ORDER  BY 1 DESC
LIMIT  1;

需要"orders"(p_id, order_date)上的索引。

详细说明:

答案 1 :(得分:1)

你似乎想要:

select max(o.order_date - p.registration_date)
from person p join
     orders o
     on p.p_id = o.p_id;

答案 2 :(得分:1)

  select max((date_part('day',age(order_date, "registration date")))) + 1 as dif 
  from (
    select "p_id" ,max(order_date) order_date
    from "Order"
    group by "p_id"
  ) T1
  left join Person T2 on T1.p_id = T2.p_id
| maxday |
|--------|
|      8 |

[SQL Fiddle DEMO LINK]

答案 3 :(得分:0)

试试这个:

SELECT MAX(DATE_PART('day', now() - '2018-02-15'::TIMESTAMP)) FROM person p
JOIN order o
USING (p_id)