下面是我的MySQL查询,找出每个帐户的连续日期之间的差异,然后使用结果来准备频率计数表。这个查询当然很慢但在此之前我做的是正确的吗?如果可以的话请帮忙。嵌入式也是一个小数据样本。 感谢你的时间。 OZooHA
ID DATE
403 2008-06-01
403 2012-06-01
403 2011-06-01
403 2010-06-01
403 2009-06-01
15028 2011-07-01
15028 2010-07-01
15028 2009-07-01
15028 2008-07-01
SELECT
month_diff,
count(*)
FROM
(SELECT t1.id,
t1.date,
MIN(t2.date) AS lag_date,
TIMESTAMPDIFF(MONTH, t1.date, MIN(t2.date)) AS month_diff
FROM tbl_name T1
INNER JOIN tbl_name T2
ON t1.id = t2.id
AND t2.date > t1.date
GROUP BY t1.id, t1.date
ORDER BY t1.id, t1.date
)
GROUP BY month_diff
ORDER BY month_diff
答案 0 :(得分:1)
可能,实现内联视图大部分时间都是如此。确保您有合适的索引可用于提高连接操作的性能;覆盖索引ON tbl_name (id, date)
可能是此查询的最佳选择。
使用合适的索引(如上所述),可以通过以下查询获得更好的性能:
SELECT d.month_diff
, COUNT(*)
FROM ( SELECT IF(@prev_id = t.id
, TIMESTAMPDIFF(MONTH, t.date, @prev_date )
, NULL
) AS month_diff
, @prev_date := t.date
, @prev_id := t.id
FROM tbl_name t
CROSS
JOIN (SELECT @prev_date := NULL, @prev_id := NULL) i
GROUP BY t.id DESC, t.date DESC
) d
WHERE d.month_diff IS NOT NULL
GROUP BY d.month_diff
请注意,不保证使用MySQL用户定义的变量。但我们确实观察到以特定方式编写的查询的一致行为。 (MySQL的未来版本可能会改变我们观察到的行为。)
编辑:我修改了上面的查询,将ORDER BY t.id, t.date
替换为GROUP BY t.id, t.date
...从示例数据中不清楚(id,date)
是否可以保证是独特。 (如果我们确实有这种保证,那么我们不需要GROUP BY,我们可以使用ORDER BY。否则,我们需要GROUP BY
来获得原始查询返回的相同结果。)< / p>