Beste allen,
Voor een website, heb ik onderstaande query om een totaal te krijgen van de kolomwaarde 'area', gebaseerd op een specifieke code.
Voorbeeld inhoud tabel 'bc_parameter_difference':
Een scenario om e.e.a. te verduidelijken:
Stel ik wil per 'object_id' een totaal van 'area' voor de code '201':
Er zal dan gezocht moeten worden naar alle objecten waarvan de laatst ingevoerde code (hoogste sequence_id) '201' is. In de voorbeeldtabel hierboven zal dus alleen object_id = 23 geselecteerd moeten worden (immers is 200 de laatste code van object_id 25.
Vervolgens wil ik van object_id = 23 het totaal van de waarde 'Area' hebben.
Na veel proberen, heb ik dit bereikt met de volgende query.
Echter, het aantal records kan snel gaan oplopen (tot 100.000+), waardoor ik het idee heb dat de query erg traag gaat worden (met name door het gebruik van een subquery en IN() ).
Hebben jullie tips voor het optimaliseren van de query om de gewenste output snel te kunnen opvragen? Of kan ik de query beter opdelen?
Alvast bedankt voor jullie tips.
Voor een website, heb ik onderstaande query om een totaal te krijgen van de kolomwaarde 'area', gebaseerd op een specifieke code.
Voorbeeld inhoud tabel 'bc_parameter_difference':
| sequence_id | object_id | code | parameter_name | parameter_value |
| 1 | 23 | 200 | area | 10 |
| 2 | 23 | 200 | area | 5 |
| 3 | 23 | 201 | area | 15 |
| 1 | 25 | 200 | area | 10 |
| 2 | 25 | 201 | area | 5 |
| 3 | 25 | 200 | area | 15 |
Een scenario om e.e.a. te verduidelijken:
Stel ik wil per 'object_id' een totaal van 'area' voor de code '201':
Er zal dan gezocht moeten worden naar alle objecten waarvan de laatst ingevoerde code (hoogste sequence_id) '201' is. In de voorbeeldtabel hierboven zal dus alleen object_id = 23 geselecteerd moeten worden (immers is 200 de laatste code van object_id 25.
Vervolgens wil ik van object_id = 23 het totaal van de waarde 'Area' hebben.
Na veel proberen, heb ik dit bereikt met de volgende query.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| SELECT
d0.object_id,
SUM(d0.parameter_value) AS values_sum,
FROM
bc_parameter_difference d0
WHERE
d0.object_id IN
(
SELECT
d1.object_id
FROM
bc_parameter_difference d1
WHERE (
SELECT COUNT(*) FROM bc_parameter_difference d2
WHERE d2.object_id = d1.object_id AND d1.sequence_id <= d2.sequence_id
) <= 1
AND
d1.project_id = 1
AND
d1.code = 201
ORDER BY
d1.object_id ASC,
d1.sequence_id ASC
)
AND
d0.parameter_name = 'area'
GROUP BY
d0.object_id |
Echter, het aantal records kan snel gaan oplopen (tot 100.000+), waardoor ik het idee heb dat de query erg traag gaat worden (met name door het gebruik van een subquery en IN() ).
Hebben jullie tips voor het optimaliseren van de query om de gewenste output snel te kunnen opvragen? Of kan ik de query beter opdelen?
Alvast bedankt voor jullie tips.