Mysql 如果某个属性在特定日期之前未出现,如何计算按该属性分组的行数?
按表格顺序Mysql 如果某个属性在特定日期之前未出现,如何计算按该属性分组的行数?,mysql,sql,Mysql,Sql,按表格顺序 CREATE TABLE Orders ( order_id int(11), customer_id int(11), purchase_date datetime ) 我们需要以下报告:对于本月之前没有下订单的客户,每个客户下了多少订单 以下是我目前使用的非常慢的sql: SELECT count(order_id) num_of_orders, customer_id FROM (SELECT order_id, customer_id FROM o
CREATE TABLE Orders (
order_id int(11),
customer_id int(11),
purchase_date datetime
)
我们需要以下报告:对于本月之前没有下订单的客户,每个客户下了多少订单
以下是我目前使用的非常慢的sql:
SELECT count(order_id) num_of_orders, customer_id
FROM (SELECT order_id, customer_id
FROM orders
WHERE customer_id NOT IN (SELECT DISTINCT customer_id
FROM orders
WHERE purchase_date < '2019-03-01')) a
GROUP BY customer_id;
有没有更快/更有效的方法来编写此查询?我将重新编写为:
SELECT COUNT(order_id), customer_id
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM orders o1 WHERE o1.customer_id = o.customer_id AND o1.purchase_date < '2019-03-01')
GROUP BY customer_id;
由于orderscustomer\u id上的索引,这将加快您的性能
但是,如果orders表包含customer_id的null,则NOT IN子查询将返回null 我不确定这会更快,但更简单:
SELECT customer_id, count(*) as num_of_orders
FROM orders o
GROUP BY customer_id
HAVING MIN(purchase_date) >= '2019-03-01';
DISTINCT不是一个函数,它是SELECT DISTINCT的一部分,只需写入SELECT DISTINCT customer\u id即可处理整个选定行。。。使代码更清晰。然而,这里甚至不需要DISTINCT,所以一个简单的选择就可以了!谢谢,修正了@jarlh