Строки фильтра SQL на разницу дат - PullRequest
0 голосов
/ 25 декабря 2018

MySQL 5.6 Имею таблицу, к которой я обращаюсь:

SELECT DISTINCT client, date_buy
FROM tickets
ORDER BY client, date_buy

, которая дает мне почти нужный результат:

------------------------------
client          | date_buy
-------------------------------
0027847524333  | 2018-06-13 16:03:43
0027847524333  | 2018-06-13 16:13:01
0027847524333  | 2018-06-18 22:03:01
0033652356025  | 2018-06-16 17:22:56
00353857861869 | 2018-08-13 17:37:56

Что мне нужно добавить в запрос, чтобы я могоставить только клиентов, где между заказами прошло более 24 часов?

Желаемый результат:

------------------------------
client          | date_buy
-------------------------------
0027847524333  | 2018-06-13 16:03:43
0027847524333  | 2018-06-18 22:03:01
0033652356025  | 2018-06-16 17:22:56
00353857861869 | 2018-08-13 17:37:56

Обновление: я хотел бы исключить повторные продажи для одного клиента, который происходил менее чем за 24 часа каждыйдругой.

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

Вот решение с использованием LAG

SELECT client, date_buy
FROM (SELECT client, date_buy, 
        DATE_ADD(IFNULL(LAG(date_buy, 1) OVER(PARTITION BY client ORDER BY client, date_buy ASC), '1900-01-01 00:00:00'), INTERVAL 24 HOUR) prev_date
      FROM tickets) sub
WHERE date_buy > prev_date
0 голосов
/ 25 декабря 2018

вы можете сделать это:

    SELECT * 
FROM tickets t_1, tickets t_2
where t_1.client = t_2.client
and DATEDIFF(hour, t_1.date_buy, t_2.date_buy) < 24
0 голосов
/ 25 декабря 2018

Кажется, что столбец date_buy относится к типу smalldatetime (если нет, вы можете легко разобрать это так).

Вот один из способовмог бы реализовать запрос.Начните с создания таблицы всех более поздних клиентов, для которых она была меньше или равна 24 часам с момента предыдущего заказа:

CREATE TABLE helper AS
SELECT DISTINCT b.client AS cl
FROM tickets AS a, tickets AS b
WHERE DATEDIFF(hour, a.date_buy, b.date_buy) <= 24 AND a.client = b.client

Затем выберите всех других клиентов из tickets:

SELECT DISTINCT client, date_buy
FROM tickets, helper
WHERE client <> cl
ORDER BY client, date_buy

Тот же результат можно получить, удалив записи из tickets, хотя это приведет к изменению исходной таблицы.Это решение учитывает разницу во времени в течение дня .

0 голосов
/ 25 декабря 2018

Вы можете попробовать использовать group by с DATE(date_buy) и client вместо DISTINCT.Тогда получите MIN(date_buy) быть вашей date_buy

Схема (MySQL v5.7)

CREATE TABLE tickets(
  client varchar(50),
  date_buy datetime
);


insert into tickets values ('0027847524333', '2018-06-13 16:03:43');
insert into tickets values ('0027847524333', '2018-06-13 16:13:01');
insert into tickets values ('0027847524333', '2018-06-18 22:03:01');
insert into tickets values ('0033652356025', '2018-06-16 17:22:56');
insert into tickets values ('00353857861869','2018-08-13 17:37:56');

Запрос # 1

SELECT client, MIN(date_buy) date_buy
FROM tickets
GROUP BY DATE(date_buy),client
ORDER BY client, MIN(date_buy);

| client         | date_buy            |
| -------------- | ------------------- |
| 0027847524333  | 2018-06-13 16:03:43 |
| 0027847524333  | 2018-06-18 22:03:01 |
| 0033652356025  | 2018-06-16 17:22:56 |
| 00353857861869 | 2018-08-13 17:37:56 |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...