Imam problem sa grupiranjem i datumima. Molim pomoć

Imam tablicu “TABLICA1” koja ima npr. sljedeća polja

ID | Naziv | Lokacija | ser_broj | datum | status

1 | Naziv1 | ulica1 | 123456 | 2012-01-12 | 1
2 | Naziv2 | ulica2 | 789456 | 2012-01-13 | 1
3 | Naziv1 | ulica3 | 123456 | 2012-01-14 | 1
4 | Naziv2 | ulica2 | 789456 | 2012-01-15 | 1

itd…

Dakle tu je vidljivo kako svaki “Naziv” ima svoj “ser_broj” ali mijenja lokaciju i vrijeme.

Ono što želim je ispisati “Nazive” sa svim prirodjeljenim podacima ali samo sa zadnjim unešenim datumom. Dakle u tom gornjem slučaju bi trebao dobiti podatke pod “ID” 3 i 4.

Probao sam ovo

SELECT id,naziv,lokacija,ser_broj,datum,status MAX(datum) AS MAXDATE FROM tablica1 GROUP BY ser_broj.

Ali čorak.

Probao sam još nekoliko kombinacija ali nešta mi fali…

Stoga ako može mala pomoć

SELECT
    TABLICA1.*
FROM
    TABLICA1
    INNER JOIN
    (
        SELECT
            SER_BROJ
          , MAX(DATUM) AS X_DATUM
        FROM
            TABLICA1
        GROUP BY
            SER_BROJ
    ) AS T
    ON
            TABLICA1.SER_BROJ = T.SER_BROJ
        AND TABLICA1.DATUM = T.X_DATUM
  ;

Ovaj upit pretpostavlja da serijski broj na jedinstveni način identificira neki objekt koji se u različite datume nalazi po različitim lokacijama. On ignorira eventualne promjene naziva. Ako je naziv zapravo naziv objekta koji se seli, onda će upit dati zadnji naziv koji je objekt nosio. Ako je naziv zapravo naziv lokacije u kojoj se objekt nalazi, onda će upit dati dati naziv zadnje lokacije na kojoj se objekt nalazio. Ako je naziv alternativni identifikator objekta, onda je on redudantan podatak, a ako je alternativni identifikator lokacije, onda je ili on ili drugo polje lokacije redudantan podatak.

Ako se u tablici nalaze dva upisa s istom vrijednosti para (ser_broj, datum), upit će dati ukupno 4 (!) zapisa za ta dva upisa, odnosno ako se nalazi N takvih zapisa, dat će ukupno N^2 takvih zapisa. Svaki zapis iz vanjskog upita će biti uparen sa svakim iz unutarnjeg. Da bi to spriječio, uvedi novi atribut koji takvo svojstvo ne može imati, primjerice datumsko/vremensko polje ili cjelobrojno polje koje će monotono rasti.

Ako ID ima to svojstvo monotonog rasta, tj. da za dva različita identifikatora ID1 i ID2, ID1 <> ID2 stoji slijedeće:

  • (datum(ID1) > datum(ID2)) => (ID1 > ID2)

onda ovaj upit radi ekvivalentnu stvar kao gornji:
SELECT
TABLICA1.*
FROM
TABLICA1
INNER JOIN
(
SELECT
MAX(ID) AS X_ID
FROM
TABLICA1
GROUP BY
SER_BROJ
) AS T
ON
TABLICA1.ID = T.X_ID
;

P.S. U gornjem uvjetu je dovoljno da je on zadovoljen samo za one ID1 i ID2 za koje vrijedi da je ser_broj(ID1) = ser_broj(ID2), a ako je zadovoljen čak za bilo koja dva različita ID1 i ID2, onda je to i poopćenje.

Sve je jasno. Zahvaljujem

Znači, ako ideš na opciju 2 pazi samo da si ne uneseš bug tako što ćeš raditi update zapisa (ispravak zbog pogreške operatera) ili naknadno unašati ranije datume (zaostaci operatera). Postoji li ta mogućnost, idi na timestamp ili uvedi posebni brojač koji će se uvijek ažurirati tako da je povijesno ispravan.