Mysql 日期差异上的SQL筛选行

Mysql 日期差异上的SQL筛选行,mysql,sql,Mysql,Sql,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

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小时内发生的重复销售。

您可以尝试将group by与DATEdate\u buy和client一起使用,而不是使用DISTINCT。 那就去买你的约会对象吧

模式MySQL v5.7

问题1

您可以这样做:

    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
似乎date_buy列是一种类型,如果不是,您可以很容易地将其命名为date_buy列

下面是实现查询的一种方法。首先,创建一个表,其中包含自上一个订单以来少于或等于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

您可以通过票据中的条目获得相同的结果,尽管这会改变原始表。此解决方案考虑了一天中的时差变化。

这里有一个使用滞后的解决方案

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

如果一天内有多个客户,你会包括第一个吗?不,我会包括所有客户。我想排除一位客户的重复销售,该客户之间的重复销售时间不到24小时。@SimonOsipov没问题,很乐意提供帮助:还有一个问题:我如何计算第一个0027847524333和第二个0027847524333之间的时间差?或者如果超过2个?
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
SELECT DISTINCT client, date_buy
FROM tickets, helper
WHERE client <> cl
ORDER BY client, date_buy
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