Max data ma gli altri campi?

di il
11 risposte

Max data ma gli altri campi?

Ciao a tutti, avrei bisogno di effettuare una query in Access molto semplice ma non riesco a venirne a capo.

Obiettivo fittizio: ottenere un solo record per marca di auto con la scadenza più recente e il campo "testo".

Tabella: Scadenze
ID AUTO DATA TESTO
1 FIAT 05/04/2020 FILTRI
2 BMW 03/05/2019 MOTORE
3 FIAT 15/03/2017 CAMBIO
4 BMW 20/10/2018 SOSPENSIONI

Ho provato a scrivere questa query:
SELECT s.auto, max(s.data) FROM scadenze AS s GROUP BY s.auto
Tutto perfetto estrapola una sola auto e la data corretta, ma se volessi avere anche il campo "testo"?
Ho provato a inserirlo banalmente nella SELECT ma per non avere un errore da access devo inserirlo anche in GROUP BY e il risultato finale è che così facendo mi estrapola tutti i record.

Grazie

11 Risposte

  • Re: Max data ma gli altri campi?

    Questo è un esempio... che poi sia banale o meno...
    Query per estrarre i prodotti con prezzo minimo/massimo da un Elenco di prodotti con provenienze diverse.
    Ipotiziamo di avere una tabella prodotto con IndiceProdotto(IdProdotto), prezzo e provenienza(a scopo di esempio).
    
    Estrae i prodotti con prezzo minimo:
        Select T1.Provenienza,MINP.IdProdotto,MINP.Minimo
        From T1
        RIGHT JOIN
            (select IdProdotto, Min(Prezzo) as Minimo
             From T1
             Group By IdProdotto) AS MINP
        ON T1.IdProdotto=MINP.IdProdotto AND T1.Prezzo=MINP.Minimo
    
    Stesso metodo per estrarre il massimo:
    CODICE
    
        Select T1.Provenienza,MAXP.IdProdotto,MAXP.Massimo
        From T1
        RIGHT JOIN
            (select IdProdotto, Max(Prezzo) as Massimo
             From T1
             Group By IdProdotto) AS MAXP
        ON T1.IdProdotto=MAXP.IdProdotto AND T1.Prezzo=MAXP.Massimo
    
    Tu invece di provenienza avrai la Marca...
  • Re: Max data ma gli altri campi?

    fab ha scritto:


    SELECT s.auto, max(s.data) FROM scadenze AS s GROUP BY s.auto
    Un'alternativa a quanto proposto da Alex :
    
    SELECT s.auto, max(s.data),first(Testo) FROM scadenze AS s 
    GROUP BY s.auto
    ORDER BY max(s.data) DESC
    
  • Re: Max data ma gli altri campi?

    Ragazzi che dire, grazie mille.
  • Re: Max data ma gli altri campi?

    max.riservo ha scritto:


    fab ha scritto:


    SELECT s.auto, max(s.data) FROM scadenze AS s GROUP BY s.auto
    Un'alternativa a quanto proposto da Alex :
    
    SELECT s.auto, max(s.data),first(Testo) FROM scadenze AS s 
    GROUP BY s.auto
    ORDER BY max(s.data) DESC
    
    Una curiosità, ma perché access in questo caso se utilizzo first() oppure un'altra funzione va bene, invece se inserisco semplicemente il campo in select non me lo accetta?

    @@alex molto valida anche la tua soluzione, grazie!
  • Re: Max data ma gli altri campi?

    fab ha scritto:


    Una curiosità, ma perché access in questo caso se utilizzo first() oppure un'altra funzione va bene, invece se inserisco semplicemente il campo in select non me lo accetta?
    Perché il campo Testo NON è inserito nel group by .... ma se lo inserissi nel Group By NON otterresti il risultato voluto.
    Presta attenzione al fatto che l'ordinamento discendente E il first(Testo) ti danno il risultato voluto.
    Se avessi usato l'ordinamento ascendente avresti dovuto usare last(testo).

    La soluzione proposta da Alex è comunque più 'SQL compatibile' ovvero è più portabile verso altri RDBMS (first e last non sempre sono accettati).
  • Re: Max data ma gli altri campi?

    Ok chiaro.
    Ho letto qualcosa a riguardo e appunto è specificato che queste funzioni non sono supportate da tutti.
    In ogni caso le ho provate entrambe.
    Grazie
  • Re: Max data ma gli altri campi?

    Mi dispiace scrivere ma le ho provate davvero tutte, se oltre la data più recente volessi anche il record con meno km?

    #ID #AUTO #DATA #TESTO #KM
    1 FIAT 05/04/2020 FILTRI 120
    2 BMW 03/05/2019 MOTORE 345
    3 FIAT 15/03/2017 CAMBIO 10
    4 BMW 20/10/2018 SOSPENSIONI 90
    SELECT s.[AUTO], s.[DATA], s.[TESTO], s.[KM]
    FROM scadenze AS s
    RIGHT JOIN
    (SELECT s2.[AUTO], MIN(s2.[DATA]) as MinDATA FROM scadenze AS s2 GROUP BY s2.[AUTO]) AS DMIN
    ON 
    s.[AUTO] = DMIN.[AUTO] AND s.[DATA] = DMIN.MinDATA
    perchè banalmente non posso mettere alla fine WHERE s.[KM]<150 ?
    cosa c'è di sbagliato? ho provato anche a inserire la condizione in ON ma niente, ho provato anche a fare una specie di JOIN annidata ma access mi da errore.
  • Re: Max data ma gli altri campi?

    Hai provato a metterlo nella Sub-SELECT...?
  • Re: Max data ma gli altri campi?

    Si funziona, dato che importavo i dati da Excel l'errore era dovuto al tipo di dato (stringa).
    Grazie ancora @Alex!
  • Re: Max data ma gli altri campi?

    Se mai qualcuno con il mio stesso problema capitasse in questo argomento la soluzione completa è la seguente:
    
    SELECT s.[AUTO], s.[DATA], s.[TESTO], s.[KM]
    FROM scadenze AS s
    RIGHT JOIN
    (SELECT s2.[AUTO], MIN(s2.[DATA]) as MinDATA, s2.[KM] FROM scadenze AS s2 WHERE s2.[KM]=0 GROUP BY s2.[AUTO], s2.[KM]) AS DMIN
    ON (s.[AUTO] = DMIN.[AUTO]) AND (s.[DATA] = DMIN.MinDATA) AND (s.[KM] = DMIN.[KM])
    
    Grazie per avermi aiutato.
  • Re: Max data ma gli altri campi?

    Bravo ma soprattutto grazie per la pubblicazione a chiusura del problema.
Devi accedere o registrarti per scrivere nel forum
11 risposte