|
原帖由 key 于 6-9-2009 15:25 发表
我现在的做法是利用前面那个讨论中的sum()方案,再利用count(*)来建立一个新的x列表,最后按照原来那个方案来做。
但这样一来速度就很成问题了。
理论上,用一条SQL语句是可以完成的,见下:
SELECT
MIN((SELECT COUNT(*) FROM temptest1 a WHERE a.x<=b.x) ) AS x0,
SUM( (CASE WHEN y=0 THEN 1 ELSE 0 END) ) AS y0,
SUM( (CASE WHEN y=1 THEN 1 ELSE 0 END) ) AS y1,
SUM( (CASE WHEN y=2 THEN 1 ELSE 0 END) ) AS y2,
SUM( (CASE WHEN y=3 THEN 1 ELSE 0 END) ) AS y3
FROM temptest1 b
GROUP BY ( ((SELECT COUNT(*) FROM temptest1 a WHERE a.x<=b.x)-1)/40)
ORDER BY x0
不过如你所说,这样做有很大的效率问题。
为了提高效率,可以考虑采用临时表方案:
CREATE TABLE temp (x int,recno int)
INSERT INTO temp (x,recno)
SELECT x, (SELECT count(*) FROM temptest1 a WHERE a.x<=b.x)
FROM temptest1 a
SELECT min(b.x) AS x0,
SUM (CASE WHEN y=0 THEN 1 ELSE 0 END) AS y0,
SUM (CASE WHEN y=1 THEN 1 ELSE 0 END) AS y1,
SUM (CASE WHEN y=2 THEN 1 ELSE 0 END) AS y2,
SUM (CASE WHEN y=3 THEN 1 ELSE 0 END) AS y3
FROM temptest1 INNER JOIN temp b ON a.x=b.x
GROUP BY (b.recno-1)/40
ORDER BY x0
DROP TABLE temp |
评分
-
查看全部评分
|