Ik heb een tabel waar ik een timestamp in heb en een temperatuur waarden.
Ik ben op zoek naar de maximale temperatuur en de daarbij horende datum en tijd. Wat mij lukt is het volgende:
Maximale waarde zoeken tussen twee datums:
SELECT max( temperatuur ) FROM `sensorwaardes` WHERE (changed_on BETWEEN '2015-03-02' AND '2015-03-03')
Maximale waarde zoeken met datum een tijd erbij
SELECT changed_on, temperatuur
FROM sensorwaardes
WHERE temperatuur=(SELECT MAX(temperatuur) FROM sensorwaardes)
Maar ik wil deze twee combineren. Ik wil als output de changed_on (datum en tijd) en maximale temperatuur tussen een bepaalde tijd.
Ik heb geprobeerd om ze te combineren alleen dan krijg ik ook waardes van 2015-03-01, maar dat geef ik toch niet op?
SELECT changed_on, temperatuur
FROM sensorwaardes
WHERE temperatuur= (SELECT MAX(temperatuur) FROM sensorwaardes WHERE (changed_on BETWEEN '2015-03-02' AND '2015-03-03'))
Wat doe ik fout, of hoe kan ik dit voor elkaar krijgen?
Je buitenste query heeft geen datum-restricties, en "temperatuur" lijkt mij niet op elk moment uniek. Daarbaast zou je best twee temperatuur-pieken in een interval kunnen hebben die hetzelfde zijn?
Je zou aflopend kunnen sorteren op temperatuur binnen dat interval, maar de vraag is/blijf dan dus of er niet meer (dezelfde) maxima zijn.
Of je zou iets met GROUP BY moeten doen, omdat je MAX gebruikt.
EDIT: het zou ook helpen als je tabel een auto-increment id heeft, dan zou je zoiets kunnen doen.
SELECT *
FROM sensorwaarden
WHERE temperatuur IN (
SELECT temperatuur
FROM sensorwaardes
WHERE changed_on BETWEEN '2015-03-02' AND '2015-03-03'
ORDER BY temperatuur DESC
LIMIT 1
)
AND changed_on BETWEEN '2015-03-02' AND '2015-03-03'
[size=xsmall]Toevoeging op 03/03/2015 02:25:02:[/size]
SELECT *
FROM sensorwaarden
WHERE temperatuur IN (
SELECT temperatuur
FROM sensorwaardes
WHERE changed_on BETWEEN '2015-03-02' AND '2015-03-03'
ORDER BY temperatuur DESC
LIMIT 1
)
AND changed_on BETWEEN '2015-03-02' AND '2015-03-03'
@Ivo: Dat gaat met aan de zekerheid grenzende waarschijnlijkheid een foutmelding opleveren, je kan geen LIMIT gebruiken in WHERE (NOT) IN/EXISTS subquery's.
SELECT
s.temperatuur,
s.changed_on
FROM
sensorwaarden s
WHERE NOT EXISTS
(SELECT 1
FROM
sensorwaarden sw
WHERE
sw.temperatuur >= s.temperatuur
AND sw.id > s.id
AND sw.changed_on BETWEEN CAST('2015-03-02' AS DATE) AND CAST('2015-03-03' AS DATE)
)
AND s.changed_on BETWEEN CAST('2015-03-02' AS DATE) AND CAST('2015-03-03' AS DATE)