所以我想过滤我的买方数据,谁在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;
你能告诉我哪里错了吗?
答案 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
类