Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere il primo record in ogni gruppo in MySQL

A volte potrebbe essere necessario ottenere la prima riga in ogni gruppo o la riga minima per gruppo. Ecco come ottenere il primo record in ogni gruppo in MySQL. Puoi anche utilizzare questa query SQL per ottenere la prima riga in ogni gruppo in MySQL, PostgreSQL, SQL Server e Oracle. Puoi usarlo per selezionare la prima riga per ogni gruppo.

Come ottenere il primo record in ogni gruppo in MySQL

Ecco i passaggi per ottenere il primo record in ogni gruppo in MySQL.

Supponiamo che tu abbia una tabella product_sales(product, order_date,sale) che contiene dati di vendita per più prodotti.

mysql> create table product_sales(product varchar(255),order_date date, sale int);

mysql> insert into product_sales(product,order_date, sale)
     values('A','2020-05-01',250),
     ('B','2020-05-01',350),
     ('C','2020-05-01',1250),
     ('A','2020-05-02',450),
     ('B','2020-05-02',650),
     ('C','2020-05-02',1050),
     ('A','2020-05-03',150),
     ('B','2020-05-03',250),
     ('C','2020-05-03',1850);

mysql> select * from product_sales;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-05-01 |  250 |
| B       | 2020-05-01 |  350 |
| C       | 2020-05-01 | 1250 |
| A       | 2020-05-02 |  450 |
| B       | 2020-05-02 |  650 |
| C       | 2020-05-02 | 1050 |
| A       | 2020-05-03 |  150 |
| B       | 2020-05-03 |  250 |
| C       | 2020-05-03 | 1850 |
+---------+------------+------+

Bonus Lettura:come ottenere record con il valore massimo in MySQL

Diciamo che vuoi ottenere il primo record in ogni gruppo, cioè per ogni prodotto. Per prima cosa utilizziamo GROUP BY per ottenere la prima data per ogni gruppo.

mysql> select product,min(order_date) from product_sales group by product;
+---------+-----------------+
| product | max(order_date) |
+---------+-----------------+
| A       | 2020-05-01      |
| B       | 2020-05-01      |
| C       | 2020-05-01      |
+---------+-----------------+

Ora che conosciamo la prima data per ogni gruppo, uniamo questo risultato alla nostra tabella originale per ottenere il primo record per gruppo di date.

mysql> select product_sales.* from product_sales,
           (select product,min(order_date) as order_date
                from product_sales
                group by product) max_sales
             where product_sales.product=max_sales.product
             and product_sales.order_date=max_sales.order_date;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-05-03 |  250 |
| B       | 2020-05-03 |  350 |
| C       | 2020-05-03 | 1250 |
+---------+------------+------+

Se vuoi ottenere l'ultimo record o il più recente per ogni gruppo, usa la funzione MAX invece di MIN sopra.

Bonus Leggi:Come ottenere l'ultimo record in ogni gruppo

Come selezionare il record più recente per ciascun utente

Allo stesso modo, puoi selezionare il primo record per ogni utente o ottenere il record più vecchio per ogni ID. Supponiamo che tu abbia la seguente tabella user_data(user_id,transaction_date,sale) con i dati di transazione dell'utente

mysql> create table user_data(user_id int, transaction_date date, sale int);

mysql> insert into user_data(user_id,transaction_date, sale)
          values('1','2020-05-01',25),
          ('2','2020-05-01',35),
          ('3','2020-05-01',125),
          ('1','2020-05-02',40),
          ('2','2020-05-02',50),
          ('3','2020-05-02',50),
          ('1','2020-05-03',15),
          ('2','2020-05-03',25),
          ('3','2020-05-03',50);


mysql> select * from user_data;
+---------+------------------+------+
| user_id | transaction_date | sale |
+---------+------------------+------+
|       1 | 2020-05-01       |   25 |
|       2 | 2020-05-01       |   35 |
|       3 | 2020-05-01       |  125 |
|       1 | 2020-05-02       |   40 |
|       2 | 2020-05-02       |   50 |
|       3 | 2020-05-02       |   50 |
|       1 | 2020-05-03       |   15 |
|       2 | 2020-05-03       |   25 |
|       3 | 2020-05-03       |   50 |
+---------+------------------+------+

Bonus Leggi:Come ottenere il record degli ultimi 15 giorni in MySQL

Innanzitutto, otteniamo la prima data per ogni ID utente utilizzando GROUP BY.

mysql> select user_id,min(transaction_date) from user_data group by user_id;
+---------+-----------------------+
| user_id | min(transaction_date) |
+---------+-----------------------+
|       1 | 2020-05-01            |
|       2 | 2020-05-01            |
|       3 | 2020-05-01            |
+---------+-----------------------+

Ora che conosciamo la data più vecchia per ogni ID utente, uniamo questo risultato alla nostra tabella originale per ottenere il primo record per gruppo di utenti.

mysql> select user_data.* from user_data,
                (select user_id,min(transaction_date) as transaction_date
                     from user_data
                     group by user_id) max_user
                  where user_data.user_id=max_user.user_id
                  and user_data.transaction_date=max_user.transaction_date;
+---------+------------------+------+
| user_id | transaction_date | sale |
+---------+------------------+------+
|       1 | 2020-05-01       |   25 |
|       2 | 2020-05-01       |   35 |
|       3 | 2020-05-01       |  125 |
+---------+------------------+------+

Si spera che tu possa ottenere il primo record in ogni gruppo in MySQL.

Ubiq semplifica la visualizzazione dei dati in pochi minuti e il monitoraggio in dashboard in tempo reale. Provalo oggi!