Estrarre terzo elemento di una lista

di il
16 risposte

Estrarre terzo elemento di una lista

Salve a tutti, sono nuova su questo forum! :)

Ho iniziato da poco ad immergermi nel mondo di SQL e quindi fatico anche con le query più semplici, quindi chiedo il vostro aiuto.

Se io avessi una tabella di ingressi in un negozio e volessi sapere in che giorno della settimana capita che un cliente entri più di due volte, come faccio? Potete aiutarmi, magari anche consigliandomi della documentazione da cui studiare?

P.S. La colonna contiene sia il giorno che l'ora, in formato 1-24. Grazie mille!

16 Risposte

  • Re: Estrarre terzo elemento di una lista

    Stai usando effettivamente SQL Server?

    Perché parli di terzo elemento di una lista?

    Come fai ad identificare il cliente?

    È un esercizio? Tu cosa proponi come soluzione?

  • Re: Estrarre terzo elemento di una lista

    25/05/2023 - oregon ha scritto:


    Stai usando effettivamente SQL Server?

    Perché parli di terzo elemento di una lista?

    Come fai ad identificare il cliente?

    È un esercizio? Tu cosa proponi come soluzione?

    Sto usando SQL SSMS.

    Mi sa che ho usato impropriamente il termine “lista”, scusate.

    Il cliente ha un codice ID, l'entrata viene registrata con un ulteriore codice. Quindi per un cliente ci possono essere diversi codici di ingresso, in diversi orari e/o giorni.

    Sì, è un esercizio ahahah io ho provato a scremare i clienti, selezionando solo coloro che sono entrati più di due volte. Riesco anche a dividerli oer fasce orarie. Ma se volessi sapere il quarto ingresso nello specifico? Non solo più di due, ma il quarto? Se scrivo come condizione che sia uguale a 4 non viene. Per ora sto procedendo con query e subquery. 

    Hai qualche dritta? Ahahah

  • Re: Estrarre terzo elemento di una lista

    Mostra la query che stai utilizzando e si può vedere

  • Re: Estrarre terzo elemento di una lista

    25/05/2023 - oregon ha scritto:


    Mostra la query che stai utilizzando e si può vedere

    select DATEPART(WEEKDAY,[DataIngresso]) orario, count(*) numIngressi, count (distinct clienti) clienti

    from [dbo].[INGRESSI]

    where clienti in (

     select clienti

     from (
      Select clienti, count(*) numIngressi from [dbo].[INGRESSI] group by clienti
     ) tmptab

     where numingressi > 2 

    )

    group by DATEPART(WEEKDAY,[DataIngresso]) order by DATEPART(hour,[DataIngresso])

    Questo mi prende tutti i clienti entrati più di due volte. Io vorrei estrarre i giorni della settimana in cui i clienti entrano la terza volta, solo la terza. Come faccio a "contare" il terzo ingresso?

  • Re: Estrarre terzo elemento di una lista

    Hai provato con:

     where numingressi = 3

    Oppure 

     where numingressi = parametro

    In modo che al variare del parametro visualizzi il numero di ingressi?

  • Re: Estrarre terzo elemento di una lista

    26/05/2023 - sihsandrea ha scritto:


    Hai provato con:

     where numingressi = 3

    Ma in questo modo non mi estrae solo i clienti entrati tre volte? E quelli che sono entrati più di 3 volte? Ma, soprattutto, come faccio a capire qual è la terza volta? Mi sfugge questo, non so come ordinarli e dire ad sql di prendere il terzo ingresso. Mi serve un contatore? 

  • Re: Estrarre terzo elemento di una lista

    Ciao

    Essendo un esercizio, ho cercato di interpretare la domanda che hai postato all'inizio, ovvero capire “in che giorno della settimana un cliente entri più di due volte”

    Secondo me la domanda è molto mirata ad utilizzare la count e la where, però per:

    1. Calcolare quante volte ciascun cliente entri in un negozio per ciascun giorno della settimana
    2. Estrarre solo i giorni della settimana in cui entra più di due volte

    In pratica, se la situazione di un cliente fosse:

    GiornoNr ingressi
    Lunedì1
    Martedì3
    Mercoledì2
    Giovedì5
    Venerdì1
    Sabato0
    Domenica0

    Secondo me l'estrazione dovrebbe portarti martedì e giovedì, poichè sono i due giorni in cui il cliente è entrato più di due volte.

    Sembra ce tu stia inece chiedendo “quale giorno della settimana fa superare il limite di due ingressi”, per cui se un cliente entra 1 volta al giorno, vorresti vedere mercoledì (giorno in cui fa il terzo ingresso)

    Qual è la domanda a cui vuoi rispondere? Opzioni:

    1. In quale giorno della settimana entra più di due volte (come credo che chieda l'esercizio stando al tuo primo post)
    2. Quale giorno della settimana il cliente fa il terzo ingresso (come chiedi dall'ultimo post)
  • Re: Estrarre terzo elemento di una lista

    Tu hai scritto:

    Questo mi prende tutti i clienti entrati più di due volte. Io vorrei estrarre i giorni della settimana in cui i clienti entrano la terza volta, solo la terza. Come faccio a "contare" il terzo ingresso?

    In italiano.

  • Re: Estrarre terzo elemento di una lista

    26/05/2023 - sihsandrea ha scritto:


    Tu hai scritto:

    Questo mi prende tutti i clienti entrati più di due volte. Io vorrei estrarre i giorni della settimana in cui i clienti entrano la terza volta, solo la terza. Come faccio a "contare" il terzo ingresso?

    In italiano.

    Scusa se non sono precisa e se la domanda non è posta in modo corretto. Faccio un po' fatica anche io perchè è un esercizio, sì, ma il quesito non è scritto. Mi è stato dettato a voce e all'inizio non l'avevo capito bene. 

    Sto cercando di capire e di imparare. La condizione where, per come l'avevi scritta, non estrae solo i clienti entrati tre volte?  Perchè non mi è ben chiaro. Io vorrei sapere, dei clienti entrati più di 3 volte, in che giorno della settimana hanno fatto il loro terzo ingresso?

    Adesso mi sono spiegata meglio? ^^'

  • Re: Estrarre terzo elemento di una lista

    26/05/2023 - PiGi78 ha scritto

    1. In quale giorno della settimana entra più di due volte (come credo che chieda l'esercizio stando al tuo primo post)
    2. Quale giorno della settimana il cliente fa il terzo ingresso (come chiedi dall'ultimo post)

    Chiedo scusa anche a te per la domanda posta male, confusa e disordinata. Non avevo compreso bene la consegna, dettata a voce. Ad ogni modo, scelgo l'opzione 2.

    Io vorrei sapere, dei clienti entrati più di 3 volte, in che giorno della settimana hanno fatto il loro terzo ingresso?

  • Re: Estrarre terzo elemento di una lista

    In questo caso la logica che applicherei è quella di avere una somma “progressiva” per giorno della settimana e quindi estrarre il primo record (clausola TOP 1 ) in cui il totalizzatore è maggiore di 2

    Per fare la somma progressiva ti rimando ad un post già presente in questo forum: https://www.iprogrammatori.it/forum-programmazione/sql-server/somma-progressiva-totalizzatore-t51143.html

    Prova ad applicare queste informazioni al tuo caso e vedi se riesci a risolvere

  • Re: Estrarre terzo elemento di una lista

    Salve a tutti,

    mh… leggo Pigi78 (ciao :D)
    >2 Quale giorno della settimana il cliente fa il terzo ingresso (come chiedi dall'ultimo post)

    e questo “senza” specificare nessuna finestra temporale? quindi “dal primo giorno di apertura del negozio?” non avrebbe molto senso…
    primo ingresso domenica 01/01/2023, secondo ingresso domenica 01/01/2023, terzo ingresso lunedi' 29/05/2023 e' accettabile???
    oppure “nell'ambito della stessa settimana?”

    anche secondo me, la richiesta e' 1) In quale giorno della settimana entra più di due volte (come credo che chieda l'esercizio stando al tuo primo post)
    ha anche un maggiore/migliore valore statistico come risultato

    salutoni romagnoli
    – 
    Andrea

  • Re: Estrarre terzo elemento di una lista

    28/05/2023 - asql ha scritto:


    primo ingresso domenica 01/01/2023, secondo ingresso domenica 01/01/2023, terzo ingresso lunedi' 29/05/2023 e' accettabile???
    oppure “nell'ambito della stessa settimana?”

    Se il terzo ingresso del cliente è lunedì 29/05/2023, vorrei che lo contasse tra i lunedì come terzo giorno d'ingresso. Il range che mi hanno dato sono tutti i record della tabella (circa 700mila). Sicuramente, come dici tu, avrebbe più senso nell'ambito della stessa settimana ma è solo un esercizio per imparare ad usare sql ahahah

    Facendo qualche ricerca credo di dover usare qualcosa del genere:

    SELECT * FROM clienti AS U WHERE (U.ingressi) In (SELECT ingressi, COUNT(ingressi) AS Numero FROM clienti HAVING Numero > 2) LIMIT 3,1

    Anche se ho imparato che limit non è disponibile per sql server. Da alcuni post ho letto che dovrei usare offset al posto di limit. Non so se sono sulla buona strada ??

    Ripeto che ho iniziato da pochissimo ad avvicinarmi a questo mondo, chiedo nuovamente scusa se pongo male le domande e se scrivo cavolate nelle query. Ci sto provando eheh

  • Re: Estrarre terzo elemento di una lista

    Having è la strada da percorrere…

    Solo qualche perplessità:

    SELECT * FROM clienti AS U WHERE (U.ingressi) In (SELECT ingressi, COUNT(ingressi) AS Numero FROM clienti HAVING Numero > 2) LIMIT 3,1

    Perché parti da clienti?

    Credo che a popolarsi sia la tabella ingressi…

    Prova ad inserire having nella prima query che hai mostrato.

    Questa:

    select DATEPART(WEEKDAY,[DataIngresso]) orario, count(*) numIngressi, count (distinct clienti) clienti from [dbo].[INGRESSI] where clienti in ( select clienti from (  Select clienti, count(*) numIngressi from [dbo].[INGRESSI] group by clienti ) tmptab where numingressi > 2 ) group by DATEPART(WEEKDAY,[DataIngresso]) order by DATEPART(hour,[DataIngresso])

    Non conosco i campi delle tabelle ma se ti mostra gli ingressi maggiori di 2 aggiungi having (condizione) dopo group by e vedi che succede.

Devi accedere o registrarti per scrivere nel forum
16 risposte