wybor daty i czasu

0

Witam, mam pewien problem ze stworzeniem selecta.

Chcialbym zeby podrupowal mi wpisy wedlug dat i wyciagnol wiersz z najwieksza wartościa czasu.

w bazie mam takie dane:

+----+-------+--------------+-----------+
| id | typ | data | czas |
+----+-------+--------------+-----------+
| 1 | a | 2009-12-21 | 16:30:00 |
| 2 | a | 2009-12-23 | 16:31:00 |
| 3 | a | 2009-12-23 | 16:33:00 |
| 4 | a | 2009-12-28 | 16:33:00 |
| 5 | a | 2009-12-28 | 16:40:00 |
| 6 | b | 2009-12-28 | 16:40:00 |
| 7 | b | 2009-12-28 | 16:45:00 |
+----+-------+--------------+-----------+

i dajac zapytanie

select id, typ, data, czas, max(czas) as x from tab where typ="a" group by data;

otrzymuje
+----+------+---------------+----------+------------+
| id | typ | data | czas | x |
+----+------+---------------+----------+------------+
| 1 | a | 2009-12-21 | 16:30:00 | 16:30:00 |
| 2 | a | 2009-12-23 | 16:31:00 | 16:33:00 |
| 4 | a | 2009-12-28 | 16:33:00 | 16:40:00 |
+----+------+---------------+----------+------------+

a chcialbym otrzymac dla kazdej zmiany daty jej maksymalny czas czyli:
+----+------+---------------+----------+------------+
| id | typ | data | czas | x |
+----+------+---------------+----------+------------+
| 1 | a | 2009-12-21 | 16:30:00 | 16:30:00 |
| 3 | a | 2009-12-23 | 16:33:00 | 16:33:00 |
| 5 | a | 2009-12-28 | 16:40:00 | 16:40:00 |
+----+------+---------------+----------+------------+

Proszę o pomoc, w jaki sposob skonstruowac to zapytanie ? probowalm jzu na rozne sposobo zagniezdzanei selectow, sortowannie i nie przynioslo to zadnych efektow.

0
SELECT MAX(id), typ, data, max(czas) AS x FROM tab WHERE typ="a" GROUP BY data, typ;

a jak nie zadziała to coś takiego

SELECT
  a.id, a.typ, a.data, a.czas
FROM
  tab a,
  (SELECT data, MAX(czas) FROM tab WHERE typ = "a" GROUP BY data) b
WHERE
  a.data = b.data
  AND a.czas = b.czas

przypuszczam, że to jest MySQL bo tylko ona ma tak powaloną składnię, że pozwala w GROUP BY wypisać nie wszystkie pola, które nie są agregowane.

0

Dzieki wielkei za tak szybka odpowiedz :)

byl maly błąd w wpisie w drugim selekcie brakowalo kolumny czas
ERROR 1054 (42S22): Unknown column 'b.czas' in 'where clause'

poprawiłem to na:

SELECT
  a.id, a.typ, a.data, a.czas
FROM
  tab a,
  (SELECT DATA, CZAS, MAX(czas) FROM tab WHERE typ = "a" GROUP BY DATA) b
WHERE
  a.data = b.data
  AND a.czas = b.czas

ale rezultat jest taki sam jak poprzednio

+----+------+---------------+----------+
| id | typ | data | czas |
+----+------+---------------+----------+
| 1 | a | 2009-12-21 | 16:30:00 |
| 2 | a | 2009-12-23 | 16:31:00 |
| 4 | a | 2009-12-28 | 16:33:00 |
+----+------+---------------+----------+

0

sorry za nie uwage ;)

nie zauwazylem pierwszego wpisu :D

SELECT MAX(id), typ, DATA, max(czas) AS x FROM tab WHERE typ="a" GROUP BY DATA, typ;

ten daje poprawne wyniki :)

ale szczerze powiem ze nic z tego nie rozumiem :/

czemu wybieramy max (id) ? i grupujemy po typie ?

0
  1. nie brakuje kolumny czas - trzeba dać alias
SELECT
  a.id, a.typ, a.data, a.czas
FROM
  tab a,
  (SELECT DATA, MAX(czas) AS czas FROM tab WHERE typ = "a" GROUP BY DATA) b
WHERE
  a.data = b.data
  AND a.czas = b.czas
  1. przeczytaj może najpierw jakiś podstawowy kurs SQLa bo podstaw Ci brak.

  2. teraz widzę, że jeśli będzie tak
    ID czas

1    16:30
2    16:50
3    16:40

to zapytanie

SELECT MAX(id), typ, DATA, max(czas) AS x FROM tab WHERE typ="a" GROUP BY DATA, typ;

zwróci złe dane.
Generalnie jeśli wartości data i max(czas) nie będą jednoznacznie identyfikować wiersza to kupa. MySQL nie ma też czegoś na kształt np. ROWID z oracle. Czy aby na pewno ID jest Ci potrzebne w tym zapytaniu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1