0

I have created the following query to make a "frequency diagram" that displays the number of rows that are between certain values:

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)

Any suggestions to optimize this script as it is quite time consuming?

3
  • Are your histogram buckets evenly spaced and sized? Commented Mar 3, 2013 at 14:14
  • Of course they are - I just looked at the code again. Commented Mar 3, 2013 at 14:15
  • Could you provide sample data (sqlfiddle?). Commented Mar 3, 2013 at 14:32

2 Answers 2

1

Try this (untested):

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'

For MySQL users, who don't have CTE expressions, try this instead:

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'

OR in Dutch:

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'
Sign up to request clarification or add additional context in comments.

5 Comments

It says Unknown column "bucket" in fieldlist
@The Code Buccaneer: I modified a second time. Did you catch the latest update?
Is this not a valid construct in MySQL perhaps: SELECT bucket = Field1 / cte.MaxField1? Let's reword it using AS
I have it working with the following script: SELECT CONCAT((MaxPercbeheerM.bucket), ' - ', (MaxPercbeheer*(M.bucket+1))) AS 'Part', COUNT() FROM ( SELECT (Percbeheer/cte.MaxPercbeheer) AS bucket, MaxPercbeheer FROM POLIS, (SELECT (MAX(Percbeheer)/10) AS MaxPercbeheer FROM POLIS)cte ) AS M GROUP BY bucket But the buckets are not correct. There are 49 rows instead of 10
I know what I forgot. Give me a minute
0

You could turn it into one query as the union parts are essentially same query:

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.