Selezionare le righe con il timestamp maggiore delle altre a parità di chiave

di il
3 risposte

Selezionare le righe con il timestamp maggiore delle altre a parità di chiave

Ciao a tutti,

comprendo che è una domanda banale, quasi una faq, ma avrei bisogno di aiuto per la mia memoria arrugginita per tarare una query.

ho una tabella fatta così su access


dove sono scritte le timbrature dei dipendenti. Per ogni cognome/nome/data/fascia oraria c'è una riga per ogni passaggio ai lettori di badge e il timestamp della timbratura. Chiaramente ogni dipendente può passare il badge da 0 a N volte per ogni fascia oraria (mattina o pomeriggio) di ciascuna giornata e quindi ci possono essere da 0 a N righe nella tabella.

A me interessa una query che mi estrapoli l'ultima timbratura fatta da ogni dipendente per ogni data e fascia oraria, quindi in riferimento ai dati in esempio, le righe evidenziate di giallo.

SELECT IDRIGA, COGNOME, NOME, DATA, FASCIA_ORARIA, LETTORE, TIMESTAMP_RIGA where il timestamp_RIGA è il maggiore a parità di COGNOME_NOME, DATA, FASCIA_ORARIA

Mi aiutate?

3 Risposte

  • Re: Selezionare le righe con il timestamp maggiore delle altre a parità di chiave

    Innanzitutto hai un problema di NORMALIZZAZIONE. Cognome Nome sono campi che devono essere riportati su una apposita tabella a parte Dipendenti. La tabella che hai mostrato dovrebbe chiamarsi Timbrature. Quindi relazione Dipendenti uno-a-molti Timbrature.

    1. Nella query devi considerare il campo IDDipendente e tutti gli altri campi di Timbrature.
    2. In visualizzazione struttura query devi cliccare in alto sul tasto Totali e devi fare in modo che ci sia Raggruppamento sui campi IDDipendente, Data, Fascia_Oraria, mentre su IDRiga (io lo chiamerei IDTimbratura) metti Ultimo.
  • Re: Selezionare le righe con il timestamp maggiore delle altre a parità di chiave

    OsvaldoLaviosa ha scritto:


    Innanzitutto hai un problema di NORMALIZZAZIONE. Cognome Nome sono campi che devono essere riportati su una apposita tabella a parte Dipendenti. La tabella che hai mostrato dovrebbe chiamarsi Timbrature. Quindi relazione Dipendenti uno-a-molti Timbrature.

    1. Nella query devi considerare il campo IDDipendente e tutti gli altri campi di Timbrature.
    2. In visualizzazione struttura query devi cliccare in alto sul tasto Totali e devi fare in modo che ci sia Raggruppamento sui campi IDDipendente, Data, Fascia_Oraria, mentre su IDRiga (io lo chiamerei IDTimbratura) metti Ultimo.
    Ok per la normalizzazione, però con il tuo suggerimento non ottengo quello che mi occorre, cioè una riga fatta cos'

    DIPENDENTE, DATA, FASCIA ORARIRA, LETTORE, TIMESTAMP TIMBRATUTA che mi dia a parità di DIP, DATA, FASCIA ORARIA, e lettore l'ultima timbratura.

    Cio' se il dipendente è passato in una fascia oraria cinque volte nel tornello A e cinque nel tornello B, due righe con gli ultimi passaggi dai due tornelli.
  • Re: Selezionare le righe con il timestamp maggiore delle altre a parità di chiave

    Crei prima una query qUltimaTimbtratura_0 che trava l'ultima timbbratura in base ai campi DIPENDENTE, DATA, FASCIA ORARIRA, LETTORE, TIMESTAMP TIMBRATUTA
    
    SELECT [COGNOME], [NOME], [DATA], [FASCIA_ORARIA], Max([TIMESTAMP_RIGA]) AS MaxDiTIMESTAMP_RIGA
    FROM Tabella
    GROUP BY [COGNOME], [NOME], [DATA], [FASCIA_ORARIA];
    
    poi una query qUltimaTimbtratura che ti farà vedere tutti i campi in base al risultato della qUltimaTimbtratura_0
    
    SELECT *
    FROM Tabella INNER JOIN qUltimaTimbtratura_0 ON (TIMESTAMP_RIGA = qUltimaTimbtratura_0.MaxDiTIMESTAMP_RIGA) AND (FASCIA_ORARIA = qUltimaTimbtratura_0.FASCIA_ORARIA) AND (DATA = qUltimaTimbtratura_0.DATA) AND (NOME = qUtimaTimbtratura_0.NOME) AND (COGNOME = qUltimaTimbtratura_0.COGNOME);
    
    ed otterrai il risultato voluto.
Devi accedere o registrarti per scrivere nel forum
3 risposte