SQL-запрос для извлечения записи с начальной и конечной датами из таблицы с одним столбцом в качестве даты - PullRequest
0 голосов
/ 24 марта 2019

У меня есть таблица с данными ниже, здесь stage (1) cr_date - дата начала, а stage (2) cr_date - дата окончания, и одно и то же электронное письмо может иметь несколько записей относительно идентификатора продукта.

email            stage    product_id   cr_date
--------------- -------- ------------ ------------
123@g.com        1         1           2019-01-10
123@g.com        1         1           2019-01-11
123@g.com        1         1           2019-01-13
345@g.com        1         1           2019-01-25
123@g.com        2         1           2019-01-28
345@g.com        1         2           2019-01-24
345@g.com        2         1           2019-01-31
789@g.com        1         2           2019-02-10
789@g.com        2         2           2019-02-15
567@g.com        2         2           2019-01-18

и я хочу, чтобы запрос извлекал записи между 2019-01-01 и 2019-01-31, результат должен быть таким, как показано ниже ??

email           product_id     start_date       end_date
-------------- ------------ ----------------- --------------
123@g.com        1            2019-01-10        2019-01-28
345@g.com        1            2019-01-25        2019-01-31

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Предполагая, что для комбинации адреса электронной почты и идентификатора продукта нет нескольких «1» или «2» в строке, вы можете использовать lead() для логики.

Итак, чтобы рассчитать даты начала и окончания:

select email, product_id, cr_date as start_date, end_date
from (select t.*,
             lead(cr_date) over (partition by email, product_id order by cr_date) as end_date
      from t
     ) t
where stage = 1 and
      cr_date >= '2019-01-01' and
      cr_date < '2019-02-01' and
      end_date >= '2019-01-01' and
      end_date < '2019-02-01';

Вы можете заменить lead() коррелированным подзапросом в более ранних версиях MySQL.

0 голосов
/ 24 марта 2019

Вот решение, вам нужно передать конкретный product_id, к вашему сведению. Я использую имя таблицы users

SELECT A.email,A.product_id,a.cr_date AS start_date,B.cr_date AS end_date 
FROM users A, users B 
WHERE a.email = b.email AND b.stage=2 AND a.stage=1 AND a.cr_date 
BETWEEN '2019-01-01' AND '2019-01-31' 
AND b.cr_date  BETWEEN '2019-01-01' AND '2019-01-31' 
AND a.product_id=1

Для всех продуктов id используйте следующее: -

SELECT A.email,A.product_id,a.cr_date AS start_date,B.cr_date AS end_date 
FROM users A, users B 
WHERE a.email = b.email AND a.product_id=b.product_id AND b.stage=2 AND a.stage=1 AND a.cr_date 
BETWEEN '2019-01-01' AND '2019-01-31' 
AND b.cr_date  BETWEEN '2019-01-01' AND '2019-01-31'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...