【发布时间】:2014-09-21 11:03:31
【问题描述】:
我的目标是创建一个查询,该查询将返回在 365 天窗口内购买的唯一客户的计数。我在 postgres 中创建了下面的查询,结果查询非常慢。我的表是 812,024 行的订单日期和客户 ID。当我删除 distinct 语句时,我可以让查询在大约 60 秒内返回结果,但我还没有完成。我在 (order_date, id) 创建了一个索引。我是 SQL 的新手,这真的是我第一次用它做任何事情,在整天试图找到解决这个问题的方法之后,我找不到任何可以开始工作的东西,即使我已经看到了很多关于 distinct 的缓慢性能。
SELECT
(d1.Ordered) AS Ordered,
COUNT(distinct d2.ID) Users
FROM
(
SELECT order_date AS Ordered
FROM orders
GROUP BY order_date
) d1
INNER JOIN
(
SELECT order_date AS Ordered, id
FROM orders
) d2
ON d2.Ordered BETWEEN d1.Ordered - 364 AND d1.Ordered
GROUP BY d1.Ordered
ORDER BY d1.Ordered
"Sort (cost=3541596.30..3541596.80 rows=200 width=29)"
" Sort Key: orders_1.order_date"
" -> HashAggregate (cost=3541586.66..3541588.66 rows=200 width=29)"
" -> Nested Loop (cost=16121.73..3040838.52 rows=100149627 width=29)"
" -> HashAggregate (cost=16121.30..16132.40 rows=1110 width=4)"
" -> Seq Scan on orders orders_1 (cost=0.00..14091.24 rows=812024 width=4)"
" -> Index Only Scan using x on orders (cost=0.43..1822.70 rows=90225 width=29)"
" Index Cond: ((order_date >= (orders_1.order_date - 364)) AND (order_date <= orders_1.order_date))"
【问题讨论】:
-
不太确定我是否理解您在这里的设置...介意给我们关于订单的表创建语句并让我们知道与用户的订单关系是如何工作的吗?我在现有查询中看不到与用户有任何关系...您正在将日期加入日期,我不太明白那里有不同的用户
-
自加入的目的是什么?
-
我不知道我说清楚了没有,但是每一行都会有一个日期和在前365天内购买的唯一客户的数量。因此,今天的数字将是去年的唯一客户数,这将是一个滑动范围,自有订单以来的每一天都有一个条目。
-
同一客户在同一天进行多次购买的频率如何?
-
只统计一次去年购买过的客户。如果他们在去年购买了一次或多次,则属于活跃客户的定义,因此我只想计算一次。我想每天跟踪这个指标,看看每天的活跃客户总数是多少。
标签: sql postgresql