Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1

    Primi record di ogni gruppo univoco

    Mi stò scervellando su questa tabella che dovrebbe

    id_______data_______identificativo_______altro1___ ____altro2
    1_____10/08/22________1234___________aaaa________yyyy
    2_____12/01/24________1100___________bbbb________cccc
    3_____15/11/23________8333___________dddd________rrrr
    4_____13/05/24________1100___________cccc________tttt
    5_____17/01/24________1234___________zzzz________iiii
    6_____12/03/25________9465___________yyyy________ssss
    7_____21/02/28________1234___________xxxx________kkkk
    8_____08/10/24________8333___________zzzz________qqqq

    dapprima ordinare per data decrescente
    id_______data_______identificativo_______altro1___ ____altro2
    7_____21/02/28________1234___________xxxx________kkkk
    6_____12/03/25________9465___________yyyy________ssss
    8_____08/10/24________8333___________zzzz________qqqq
    4_____13/05/24________1100___________cccc________tttt
    5_____17/01/24________1234___________zzzz________iiii
    2_____12/01/24________1100___________bbbb________cccc
    3_____15/11/23________8333___________dddd________rrrr
    1_____10/08/22________1234___________aaaa________yyyy

    e poi eliminare i doppioni nell'identificativo (prendendo quindi i primi record con tanto di dati a seguito)
    id_______data_______identificativo_______altro1___ ____altro2
    7_____21/02/28________1234___________xxxx________kkkk
    6_____12/03/25________9465___________yyyy________ssss
    8_____08/10/24________8333___________zzzz________qqqq
    4_____13/05/24________1100___________cccc________tttt

    Io avevo fatto così:

    SELECT
    a.ID AS ID,
    a.DATA AS DATA,
    a.IDENTIFICATIVO AS IDENTIFICATIVO,
    a.ALTRO1 AS ALTRO1,
    a.ALTRO2 AS ALTRO2
    FROM
    (SELECT
    tabella.id AS ID,
    tabella.data AS DATA,
    tabella.identificativo AS IDENTIFICATIVO,
    tabella.altro1 AS ALTRO1,
    tabella.altro2 AS ALTRO2
    FROM tabella ORDER BY data DESC) AS a
    GROUP BY a.identificativo

    non riesco a capire perchè la solita query qui sopra se eseguita nel mio sorgente funziona ma se la eseguo come SQL in phpmyadmin mi dà un'errore, dice che non esiste identificativo ma invece id rimane univoco. Voi come la fareste?
    Prima o poi anch'io vi insegnerò qualcosa

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    537
    io scriverei la query così,
    Codice PHP:
    select   t1.data t1.identificativot2.altro1t2.altro2
    from
    (select identificativomax(data) as data from tabella group by identificativot1
    left join tabella t2 
    on t1
    .identificativo t2.identificativo 
    and t1.data t2.data
    order by t1
    .data desct1.identificativo 
    con questo risultato
    Codice PHP:
    2028-02-21    1234    xxxx    kkkk
    2025
    -03-12    9465    yyyy    ssss
    2024
    -10-08    8333    zzzz    qqqq
    2024
    -05-13    1100    cccc    tttt 
    Ultima modifica di marino51; 15-03-2025 a 22:48

  3. #3
    Appena posso provo anche la tua soluzione, in rete poco prima che mi scrivessi avevo trovato questa soluzione e la stavo testando:

    WITH tabmom AS (
    SELECT
    id,
    identificativo,
    data,
    altro1,
    altro2,
    RANK() OVER(
    PARTITION BY identificativo
    ORDER BY data DESC) as primorecord
    FROM tabella)
    SELECT
    id, identificativo,
    data,
    altro1,
    altro2
    FROM tabmom
    WHERE primorecord=1

    funziona
    Prima o poi anch'io vi insegnerò qualcosa

  4. #4
    Devo dire che la soluzione di Marino51 è la migliore di quelle ho provato (almeno per quello che mi intendo), è l'unica che mi funziona sia nelle mie pagine php che se metto il codice SQL in phpmyadmin.

    E proprio quest'ultimo è il mio problema perchè anche la mia soluzione postata all'inizio e quella del mio precedente messaggio funziona nelle pagine php, ma se inserisco il codice in phpmyadmin mi restituisce l'errore che riporto:

    #1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'a.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by


    La soluzione di Marino invece è TOP!!!
    Prima o poi anch'io vi insegnerò qualcosa

  5. #5
    corretto che ti dia errore.

    Quando usi la GROUP BY(), nella SELECT potrai mettere soltanto:
    1. le colonne che hai messo nella GROUP BY()
    2. aggregati (tipo COUNT(), MAX(), AVG() ecc)
    Ogni altra colonna inclusa nella SELECT ti darà l'errore che hai postato

  6. #6
    Però non mi torna una cosa:

    Utilizzando la query sopra descritta ovvero

    select t1.data , t1.identificativo, t2.altro1, t2.altro2
    from
    (select identificativo, max(data) as data from tabella group by identificativo) t1
    left join tabella t2
    on t1
    .identificativo = t2.identificativo
    and t1.data = t2.data
    order by t1
    .data desc, t1.identificativo
    applicata alla mia fattispecie

    mi dà 3140 record

    ma se faccio un

    SELECT DISTINCT(identificativo) FROM tabella

    me ne da 3135

    cosa potrebbe essere? perchè questa discrepanza di 5 record? (ovviamente su così tanti record un controllo manuale non è possibile)
    Ultima modifica di riccardo1975; 20-03-2025 a 18:33
    Prima o poi anch'io vi insegnerò qualcosa

  7. #7
    Utente di HTML.it L'avatar di abellos
    Registrato dal
    Feb 2002
    Messaggi
    429
    Volendo puoi sapere quali sono i record discordanti, dato che hai nelle tabelle un identificativo, puoi prendere la lista identificativi da t1 e da t2 e fare un left join e poi un right join e vedi dove ci sono valori vuoti da una parte o dall'altra, cosi trovi i 5 record sballati.
    Se fai distinct e ti trovi meno record hai sicuramente dei valori doppi di identificativo da qualche parte
    Da un grande potere derivano grandi responsabilità

  8. #8
    Correggimi se sbaglio perchè mi da 0 record sia la left join che la right join

    left:
    SELECT
    a.identificativo AS A_IDENTIFICATIVO,
    c.identificativo C_IDENTIFICATIVO
    FROM (
    select t1.data , t1.identificativo, t2.altro1, t2.altro2
    from
    (select identificativo, max(data) as data from tabella group by identificativo) t1
    left join tabella t2
    on t1.identificativo = t2.identificativo
    and t1.data = t2.data
    order by t1.data desc, t1.identificativo
    ) AS a
    LEFT JOIN (
    SELECT distinct(identificativo) FROM tabella
    ) AS c
    ON a.identificativo = c.identificativo
    WHERE c.identificativo IS NULL;
    RIGHT:
    SELECT
    a.identificativo AS A_IDENTIFICATIVO,
    c.identificativo C_IDENTIFICATIVO
    FROM (
    select t1.data , t1.identificativo, t2.altro1, t2.altro2
    from
    (select identificativo, max(data) as data from tabella group by identificativo) t1
    left join tabella t2
    on t1.identificativo = t2.identificativo
    and t1.data = t2.data
    order by t1.data desc, t1.identificativo
    ) AS a
    RIGHT JOIN (
    SELECT distinct(identificativo) FROM tabella
    ) AS c
    ON a.identificativo = c.identificativo
    WHERE a.identificativo IS NULL;
    Ultima modifica di riccardo1975; 20-03-2025 a 20:35
    Prima o poi anch'io vi insegnerò qualcosa

  9. #9
    è possibile che ci siano più di un record per lo stesso identificativo con la stessa data, e questa data è la più alta del gruppo

    id data
    1 10/10/10
    1 10/10/10
    1 09/09/09

    probabilmente la tua query riporta due record, mentre la distinct 1

  10. #10
    Esattamente, era proprio così, c'ho perso l'occhi e la nottata ma li ho trovati tutti e 5 e altri 3 che non erano le ultime date, quindi torna che faccia così. Ora vedo come normalizzare la situazione nella mia fattispecie.

    GRAZIE
    Prima o poi anch'io vi insegnerò qualcosa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.