Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Select ostatniego wpisu z każdego dnia
elektromis
post 8.02.2024, 19:54:21
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 19.08.2019

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trueblue
post 8.02.2024, 20:17:47
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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;


--------------------
Go to the top of the page
+Quote Post
elektromis
post 8.02.2024, 21:39:57
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 19.08.2019

Ostrzeżenie: (0%)
-----


@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


Ten post edytował elektromis 8.02.2024, 21:41:41
Go to the top of the page
+Quote Post
trueblue
post 9.02.2024, 07:22:20
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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)


--------------------
Go to the top of the page
+Quote Post
elektromis
post 9.02.2024, 12:18:39
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 19.08.2019

Ostrzeżenie: (0%)
-----


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.

Ten post edytował elektromis 9.02.2024, 12:20:20
Go to the top of the page
+Quote Post
trueblue
post 9.02.2024, 13:09:30
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
elektromis
post 9.02.2024, 18:42:41
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 19.08.2019

Ostrzeżenie: (0%)
-----


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

Ten post edytował elektromis 9.02.2024, 17:17:46
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 00:03