Mariadb sql vraagje

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Smika
  • Registratie: Januari 2006
  • Laatst online: 20-05-2024
Mijn vraag

Ik ben mijn p1 meter aan t uitlezen en dezedata aan het opslaan in een mysql database. Nu werkt dit perfect, maar nu wil ik ook een berekening gaan toepassen. Dit lukt me wel op basis van een waarde die in de database staat, zie voorbeeld hieronder, maar zou eigenlijk eerst de 2 gevonden waardes van elkaar af willen trekken onder de kollom Gas, voordat de berekening plaats vind. Ik kom er alleen niet uit hoe ik dit het beste kan doen. Het resultaat moet zo worden, dat ik de dagelijkse kosten van mijn gas verbruik eruit krijg.

Relevante software en hardware die ik gebruik

mariadb

Wat ik al gevonden of geprobeerd heb

mysql -p -e "SELECT a.date, a.time, a.Gas, b.gastarief, (a.Gas/1000 * b.gastarief) AS kosten_gas FROM P1uitlezen a, leverancier b WHERE a.time = '00:00:00' AND b.ID = 2 AND a.date > DATE_ADD(NOW(), INTERVAL -2 DAY)" p1db
Enter password:
+------------+----------+--------+-----------+--------------------+
| date | time | Gas | gastarief | kosten_gas |
+------------+----------+--------+-----------+--------------------+
| 2019-10-14 | 00:00:00 | 602409 | 0.69093 | 416.22245572435855 |
| 2019-10-15 | 00:00:00 | 602796 | 0.69093 | 416.48984563779834 |
+------------+----------+--------+-----------+--------------------+

Hopelijk kan iemand mij een duw in de goede richting geven.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hopscotch
  • Registratie: September 2015
  • Laatst online: 28-09-2021
Je kunt zover ik weet alleen berekeningen uitvoeren over dezelfde rij, dus je zult moeten zorgen dat zowel het resultaat van de meting die je wilt weten als het resultaat van de vorige meting in dezelfde rij terecht komen. Dat zou via een join moeten kunnen.
Iets als
SELECT (a.Gas - b.Gas) as dagverbruik
FROM P1uitlezen a join P1uitlezen b on a.date = (b.date -1 DAY)

Dit is pseudo code , maar in die richting zul je het denk ik moeten zoeken. Alleen moet je nog wel even goed nadenken wat er met de time moet gebeuren, als die altijd 00:00:00 is dan is er geen probleem, maar als je op verschillende tijdstippen meet zal je daar ook nog rekening mee moeten houden op een of andere manier.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dat gezegd hebbende kun je dit soort dingen beter ofwel in code oplossen in plaats van in je query, ofwel de data redundant opslaan per rij.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • +3 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 14:08
Daar zijn window functions voor bedacht:
https://mariadb.com/kb/en/library/window-frames/

Bijvb middels LAG of window frames met PRECEDING.
(wel wat geavanceerdere SQL, maar zijn wel tutorials over te vinden nu je weet waar op je kunt zoeken.

[ Voor 49% gewijzigd door gekkie op 15-10-2019 23:38 ]


Acties:
  • 0 Henk 'm!

  • Smika
  • Registratie: Januari 2006
  • Laatst online: 20-05-2024
Hopscotch schreef op dinsdag 15 oktober 2019 @ 23:30:
Je kunt zover ik weet alleen berekeningen uitvoeren over dezelfde rij, dus je zult moeten zorgen dat zowel het resultaat van de meting die je wilt weten als het resultaat van de vorige meting in dezelfde rij terecht komen. Dat zou via een join moeten kunnen.
Iets als
SELECT (a.Gas - b.Gas) as dagverbruik
FROM P1uitlezen a join P1uitlezen b on a.date = (b.date -1 DAY)

Dit is pseudo code , maar in die richting zul je het denk ik moeten zoeken. Alleen moet je nog wel even goed nadenken wat er met de time moet gebeuren, als die altijd 00:00:00 is dan is er geen probleem, maar als je op verschillende tijdstippen meet zal je daar ook nog rekening mee moeten houden op een of andere manier.
Bedankt voor de snelle reactie, maar zoals ik het nu lees kunnen JOINS alleen maar over meerdere tabellen. Bij mij komt alles in dezelfde tabel terecht. Ik heb wel een tweede tabel, maar hier staat data in, die nu niet zo belangrijk is. Ik ga morgen er nog even verder over doorlezen, want vind het wel interessant. Ik hoef me alleen maar zorgen te maken over de tijd 00:00:00, aangezien dit altijd hetzelfde zal blijven.

Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Smika schreef op woensdag 16 oktober 2019 @ 00:12:
[...]

Bedankt voor de snelle reactie, maar zoals ik het nu lees kunnen JOINS alleen maar over meerdere tabellen.
Nee hoor. Ik run toch echt wel een paar keer per jaar een query om dubbelen op te sporen, iets als:
SQL:
1
2
3
4
5
6
SELECT u1.*
FROM User u1
  JOIN User u2
  ON u1.Email = u2.Email
    AND u1.Id <> u2.Id
ORDER BY u1.Email


Dat gezegd hebbende, de oplossing van @gekkie is eleganter.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Smika
  • Registratie: Januari 2006
  • Laatst online: 20-05-2024
NMe schreef op woensdag 16 oktober 2019 @ 00:16:
[...]

Nee hoor. Ik run toch echt wel een paar keer per jaar een query om dubbelen op te sporen, iets als:
SQL:
1
2
3
4
5
6
SELECT u1.*
FROM User u1
  JOIN User u2
  ON u1.Email = u2.Email
    AND u1.Id <> u2.Id
ORDER BY u1.Email


Dat gezegd hebbende, de oplossing van @gekkie is eleganter.
'
Goed om zeker te weten dat het wel zou moeten kunnen. Voor mijn learning curve ga ik eerst even kijken naar de JOIN variant en zal dan daarna nog kijken naar de oplossing van @gekkie. Leuk om zodoende wat te leren. Ik post zeker weer als ik meer info heb.

Acties:
  • 0 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 14:08
SQL bestaat al een tijdje, dus voor veel voorkomende vraagstukken is er vaak wel specifieke functionaliteit toegevoegd waarin het allemaal net wat efficienter en mooier kan :).

Maar met een self JOIN kan het inderdaad ook.

En over het algemeen is de performance in je DB een stuk vlotter dan als je het zelf in je eigen code probeert op te lossen. Dus dat zou echt m'n last resort zijn. Meestal moet je en een hoop meer data overhalen en ga je daar in een matig efficiente taal op een matig efficiente manier overheen loopen.

(overigens was dat bij no-sql helemaal een feestje (voordat mongodb iets join-a-like had), zat je in je eigen script code zelf join functionaliteit te bouwen (erg kansloos traag) ... was me toen wel duidelijk dat mongodb eigenlijk alleen maar leuk was als veredelt filesystem met nogal beperkte garanties .. en dat een hoop dingen uiteindelijk toch een relationele component hebben).
Pagina: 1