SQL: найти самый длинный промежуток даты из нескольких таблиц - PullRequest
0 голосов
/ 07 июня 2018

мне нужна помощь.У меня есть две таблицы, подобные этой.

Таблица Person

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

Порядок таблиц

Order_id| p_id | order_date
----------------------------
    123 |   1  | 2018-01-05
    345 |   2  | 2018-02-06
    678 |   3  | 2018-03-07
    910 |   4  | 2018-01-08
    012 |   3  | 2018-03-04
    234 |   4  | 2018-01-05
    567 |   5  | 2018-02-08
    890 |   6  | 2018-03-09 

Мне нужно выяснить, сколько дней самый длинный период, когда эти дватаблица не обновляется.

Какой самый простой запрос для получения результата в SQL?

Спасибо

ОБНОВЛЕНИЕ: В результате должен отображаться самый длинный промежуток между датами order_dateи регистрация_дата.Поскольку самый длинный разрыв даты - 2018-01-08 и 2018-02-01, поэтому результат должен возвращать '24'

Ответы [ 4 ]

0 голосов
/ 07 июня 2018
  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]

0 голосов
/ 07 июня 2018

Принимая во внимание текущий 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).

Подробное объяснение:

0 голосов
/ 07 июня 2018

Вы, кажется, хотите:

select max(o.order_date - p.registration_date)
from person p join
     orders o
     on p.p_id = o.p_id;
0 голосов
/ 07 июня 2018

Попробуйте это:

SELECT MAX(DATE_PART('day', now() - '2018-02-15'::TIMESTAMP)) FROM person p
JOIN order o
USING (p_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...