在几个日期的mysql中过滤几个数据

时间:2019-12-29 06:48:18

标签: mysql-workbench

所以我想过滤我的买方数据,谁在2019年1,2,3个月(1月至3月)进行交易,谁也在2017年4,5,6个月(4月至6月)进行交易,所以如果买方在2017年4月之前进行交易时,买方没有出现在列表中,我已经尝试过使用我的语法,但是idk为什么结果如此之多,这是我的语法

SELECT DISTINCT
    d1.buyer_id
FROM data_2019 d1 
WHERE
    MONTH (d1.tgl) IN (1, 2, 3) AND
    NOT EXISTS (SELECT 1 FROM data_2017 d2
                WHERE d2.buyer_id = d1.buyer_id AND d2.tgl < '2017-04-01')
GROUP BY
    buyer_id;

你能告诉我哪里错了吗?

2 个答案:

答案 0 :(得分:0)

我会使用两个 EXISTS子句来表达这一点:

SELECT DISTINCT
    d1.buyer_id
FROM data_2019 d1
WHERE
    d1.tgl >= '2019-01-01' AND d1.tgl < '2019-04-01' AND
    EXISTS (SELECT 1 FROM data_2017 d2
            WHERE d2.buyer_id = d1.buyer_id AND
                  d2.tgl >= '2017-04-01' AND d2.tgl < '2017-07-01') AND
    NOT EXISTS (SELECT 1 FROM data_2017 d2
                WHERE d2.buyer_id = d1.buyer_id AND d2.tgl < '2017-04-01');

第一个EXISTS子句断言,第一个查询2019买方在2017年的4月至6月之间(包括两个月)也处于活动状态。第二个EXISTS子句确保该相同的买方也没有活动2017年第一季度。

答案 1 :(得分:0)

我怀疑除了Tim Biegeleisen指出的问题外,还有另外两个问题。

首先,data_2019中每个买家的每笔交易都将导致data_2017中的测试。我建议从所有买家的表中进行查询,并在EXISTS()上使用data_2019子句。这也应该消除对DISTINCT子句的需要。

第二,随着时间的流逝,将数据按年划分到不同的表中将是一个严重的麻烦。为什么不将它们全部放在一个表中?

因此:

SELECT 
    b.buyer_id
FROM buyer b
WHERE
    EXISTS (SELECT 1 FROM data_all d
            WHERE d.buyer_id = b.buyer_id AND
                  d.tgl >= '2019-01-01' AND d.tgl < '2019-04-01') AND
    EXISTS (SELECT 1 FROM data_all d
            WHERE d.buyer_id = b.buyer_id AND
                  d.tgl >= '2017-04-01' AND d.tgl < '2017-07-01') AND
    NOT EXISTS (SELECT 1 FROM data_all d
                WHERE d.buyer_id = b.buyer_id AND
                      d.tgl >= '2017-01-01' AND d.tgl < '2017-04-01');

在这一点上,如果您想将“ 2017年4月之前”子句扩展到所有年份,则只需删除d.tgl >= '2017-01-01'子句,否则每年可能需要很多NOT EXISTS