我在这里提供了当前正在使用的表的简化示例:http : //sqlfiddle.com/#!17/c57e33/1
CREATE TABLE orders
(id SERIAL PRIMARY KEY,
customer_id INT,
created_at DATE)
;
INSERT INTO orders
(customer_id, created_at)
VALUES
(1, '2019-10-09'),
(1, '2019-10-01'),
(1, '2019-08-09'),
(2, '2019-10-09'),
(2, '2019-10-09'),
(3, '2019-09-09'),
(3, '2019-08-09'),
(4, '2019-08-09'),
(4, '2019-08-09'),
(5, '2019-10-09'),
(5, '2019-10-09'),
(5, '2019-08-09')
;
我的问题是我只想退回在两个特定日期有一个或多个订单的客户,而在这两个日期之间没有订单。在小提琴中,只有customer_id 5应该匹配。
在尝试了多种不同的查询方式之后,我终于找到了一种使用一堆EXISTS子句的工作方式:
SELECT DISTINCT(customer_id)
FROM orders o1
WHERE EXISTS (SELECT 1 FROM orders o2 WHERE o1.customer_id = o2.customer_id AND o2.created_at = '2019-10-09')
AND EXISTS (SELECT 1 FROM orders o2 WHERE o1.customer_id = o2.customer_id AND o2.created_at = '2019-08-09')
AND NOT EXISTS (SELECT 1 FROM orders o2 WHERE o1.customer_id = o2.customer_id AND o2.created_at BETWEEN '2019-08-10' AND '2019-10-08')
但是我想知道是否有更简单,更有效的方法来做到这一点。
您可以使用条件聚合:
SELECT customer_id
FROM orders
WHERE created_at BETWEEN '2019-08-09' AND '2019-10-09'
GROUP BY customer_id
HAVING MIN(created_at) = '2019-08-09'
AND MAX(created_at) = '2019-10-09'
AND COUNT(DISTINCT created_at) = 2
该HAVING
子句将过滤条件匹配的组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句