2013-03-03 105 views
0

我已經創建了下面的查詢,以顯示這是一定值之間的行數「頻率圖」:因爲它是相當的時間優化我的SQL查詢

SELECT CONCAT('0 - ', M.MaxField1) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1<M.MaxField1 
UNION ALL 
SELECT CONCAT((M.MaxField1), ' - ', (M.MaxField1*2)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1) AND P.Field1<(M.MaxField1*2) 
UNION ALL 
SELECT CONCAT((M.MaxField1*2), ' - ', (M.MaxField1*3)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*2) AND P.Field1<(M.MaxField1*3) 
UNION ALL 
SELECT CONCAT((M.MaxField1*3), ' - ', (M.MaxField1*4)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*3) AND P.Field1<(M.MaxField1*4) 
UNION ALL 
SELECT CONCAT((M.MaxField1*4), ' - ', (M.MaxField1*5)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*4) AND P.Field1<(M.MaxField1*5) 
UNION ALL 
SELECT CONCAT((M.MaxField1*5), ' - ', (M.MaxField1*6)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*5) AND P.Field1<(M.MaxField1*6) 
UNION ALL 
SELECT CONCAT((M.MaxField1*6), ' - ', (M.MaxField1*7)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*6) AND P.Field1<(M.MaxField1*7) 
UNION ALL 
SELECT CONCAT((M.MaxField1*7), ' - ', (M.MaxField1*8)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*7) AND P.Field1<(M.MaxField1*8) 
UNION ALL 
SELECT CONCAT((M.MaxField1*8), ' - ', (M.MaxField1*9)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*8) AND P.Field1<(M.MaxField1*9) 
UNION ALL 
SELECT CONCAT((M.MaxField1*9), ' - ', (M.MaxField1*10)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M 
WHERE P.Field1>=(M.MaxField1*9) 

任何建議,以優化這個腳本消費?

+0

您的直方圖桶均勻間隔和大小? – 2013-03-03 14:14:36

+0

當然,他們是 - 我只是再看看代碼。 – 2013-03-03 14:15:29

+0

您能否提供樣本數據(sqlfiddle?)。 – 2013-03-03 14:32:55

回答

1

試試這個(未經測試):

WITH cte(MaxField1) AS (
    SELECT (MAX(Field1)/10) AS MaxField1 FROM TABLE1 
) 
SELECT 
    'Part', 
    COUNT(*) 
FROM (
    SELECT 
     CONCAT((MaxField1*M.bucket), ' - ', (MaxField1*(M.bucket+1))) AS 'Part', 
     Field1/cte.MaxField1 AS bucket 
    FROM TABLE1, cte 
) AS M 
GROUP BY 'Part' 

對於MySQL用戶,沒有CTE表達式誰,試試這個來代替:

SELECT 
    'Part', 
    COUNT(*) 
FROM (
    SELECT 
     CONCAT((MaxField1*M.bucket), ' - ', (MaxField1*(M.bucket+1))) AS 'Part', 
     Field1/cte.MaxField1 AS bucket 
    FROM TABLE1, 
    (SELECT (MAX(Field1)/10) AS MaxField1 FROM TABLE1)cte 
) AS M 
GROUP BY 'Part' 

或荷蘭語:

SELECT 
    'Part', 
    COUNT(*) 
FROM ( 
    SELECT 
     CONCAT((MaxPercbeheer*M.bucket), ' - ', (MaxPercbeheer*(M.bucket+1))) AS 'Part', 
     (Percbeheer/cte.MaxPercbeheer) AS bucket, 
     MaxPercbeheer 
    FROM POLIS, (SELECT (MAX(Percbeheer)/10) AS MaxPercbeheer FROM POLIS) cte 
) AS M 
GROUP BY 'Part' 
+0

在第一行發出錯誤。 – 2013-03-03 14:31:38

+0

MySQL不支持CTE – 2013-03-03 14:32:03

+0

@Jakub:答案用替代方法更新。 – 2013-03-03 14:34:36

0

您可以將它變成一個查詢,因爲聯合部分基本上是相同的查詢:

create temporary table range_tmp (start int, end int); 
insert into range_tmp values (0,1),(1,2),(2,3),(3,4),(4,5),(5,6),(7,8),(9,10); 

SELECT CONCAT((M.MaxField1*t.start), ' - ', (M.MaxField1*t.end)) AS 'Part',COUNT(*) 
FROM TABLE1 P, (SELECT (MAX(Field1)*(1/10)) AS MaxField1 FROM TABLE1) AS M, range_tmp t 
WHERE (P.Field1>=(M.MaxField1*t.start) or t.start=1) AND (P.Field1<(M.MaxField1*t.end) or t.end=10)