Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ Select ostatniego wpisu z każdego dnia

Napisany przez: elektromis 8.02.2024, 19:54:21

Hmm ale tytuł tematu smile.gif.

Zapisuje w bazie dane z licznika energii elektrycznej co 5 min. Mam kolumne id_pomiar - auto, DataCzas - timestamp, oraz pomiar jako INT.
chodzi mi oto żeby doczytywać zurzycie energo na koniec kazdego dnia, całoś moge ograniczyć limitem do ostatnich 31 wynikow na przykład.

Pytanie ma ktoś pomysł jak skonstrułować takiego select-a. Jesli chodzi o bazy danych to nie jestem zbyt mocny może popełniłem blad i powinienem w innej tabeli zapisywac stan licznika na godz 0.00 ale to dublowanie danych.

Czekam na podpowiedzi. Pozdrawiam

Napisany przez: trueblue 8.02.2024, 20:17:47

  1. SELECT t1.DataCzas, t1.pomiar
  2. FROM tabela AS t1
  3. INNER JOIN (SELECT id_pomiar, MAX(DataCzas) AS DataCzas FROM tabela GROUP BY id_pomiar) AS t2
  4. ON t1.id_pomiar = t2.id_pomiar;

Napisany przez: elektromis 8.02.2024, 21:39:57

@trueblue dziekuje za szybką podpowiedź
niestety to rozwiazanie wyswietla mi wszystkie zapisane wiersze.

Znalazłem rozwiazanie które działa smile.gif uważam temat za zamkniety.


  1. SELECT d1.* FROM tabela d1,
  2. (SELECT date(DataCzas), max(DataCzas) AS max_DataCzas
  3. FROM tabela
  4. GROUP BY date(DataCzas) ) d2
  5. WHERE d1.DataCzas= d2.max_fecha
  6. AND d1.DataCzas>= '2024-02-08 23:59:59' - INTERVAL 30 DAY

Napisany przez: trueblue 9.02.2024, 07:22:20

Fakt.

Poprawka:

  1. SELECT t1.DataCzas, t1.pomiar
  2. FROM tabela AS t1
  3. INNER JOIN (SELECT DATE(DataCzas), MAX(DataCzas) AS DataCzas FROM tabela GROUP BY DATE(DataCzas)) AS t2
  4. ON t1.DataCzas = t2.DataCzas;


Natomiast nie wiem jak to możliwe, że Twoje zapytanie w ogóle działa, bo jest błąd w warunku WHERE.
Powinno być:
  1. WHERE d1.DataCzas= d2.max_DataCzas


Co w sumie daje takie samo zapytanie jako moje po poprawce smile.gif)

Napisany przez: elektromis 9.02.2024, 12:18:39

Tak masz racje mój błąd podczas kopiowania, u mnie nazwa tabeli i kolumn maja inne nazwy te podałem jako przykład zeby było zrozumiale.
Dziekuję twoje rozwiązanie też teraz działa kolejny przykład ze na wszystko znajdzie sie jakies rozwiazanie nie kiedy wiecej niż jedno.

  1. WHERE d1.DataCzas= d2.max_DataCzas


A jak już tu jesteśmy to zapytam jeszcze czy mozna by było zastosowac jakas formułe matematyczna to znaczy wynik w kolumnie pomiar jest narastajacy to znaczy kazdy wiersz ma coraz wieksza wartosc i teraz czy mozna jakos obliczyć dzienne zuzycie tz ostatni wiersz minus przed ostatni tak aby miec informacje jakie było dzienne zuzycie.

I drugie pytanie jak uzyskac wynik dla ostatniego wiersza w kazdym miesiacu.

Napisany przez: trueblue 9.02.2024, 13:09:30

Tu jest przykład z narastającym: https://kawalekkodu.pl/pare-to-lama-czyli-o-sumie-skumulowanej-oraz-diagramie-pareta-w-mysql
Musisz resetować "licznik" każdego dnia.

Napisany przez: elektromis 9.02.2024, 18:42:41

Dzienne zuzycie zrobiłem w ten sposób, zostawiłem już moje nazwy tabel i kolumn

  1. SELECT DATE(d1.enmes_ts), d1.`enmes_kWh`,
  2. d1.enmes_kWh-(SELECT enmes_kWh FROM LMG_enmes WHERE DATE(enmes_ts)= DATE_SUB(DATE(d1.enmes_ts), INTERVAL 1 DAY) AND `enmes_mesgerid` = 1 ORDER BY `enmes_id` DESC LIMIT 1 )AS diff_kWh
  3. FROM LMG_enmes d1, (SELECT date(`enmes_ts`), MAX(`enmes_ts`) AS max_fecha FROM LMG_enmes GROUP BY date(enmes_ts) ) d2 WHERE d1.enmes_ts = d2.max_fecha AND `enmes_mesgerid` = 1 ORDER BY `enmes_ts` ASC


Dzieki bardzo @trueblue , dzieki zabawie z tym zrozumiałem dokładnie jak to działa

A tu ostatni wynik w miesiącu
  1. SELECT d1.* FROM LMG_enmes d1,
  2. (SELECT MAX(`enmes_id`) AS max_id FROM LMG_enmes WHERE `enmes_mesgerid` = 1 GROUP BY LAST_DAY(enmes_ts) ) d2
  3. WHERE d1.enmes_id = d2.max_id AND `enmes_mesgerid` = 1 ORDER BY `enmes_id` ASC;


smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)