Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erhalten Sie den letzten Datensatz in jeder Gruppe in MySQL

Manchmal müssen Sie möglicherweise den neuesten Datensatz auswählen oder den neuesten Datensatz für jedes Datum, jeden Benutzer, jede ID oder jede andere Gruppe abrufen. Hier ist die SQL-Abfrage, um den letzten Datensatz in jeder Gruppe in MySQL zu erhalten, da es dafür keine eingebaute Funktion gibt. Sie können es auch verwenden, um die letzte Zeile für jede Gruppe in PostgreSQL, SQL Server und Oracle auszuwählen.

So erhalten Sie den letzten Datensatz in jeder Gruppe in MySQL

Hier sind die Schritte, um den letzten Datensatz in jeder Gruppe in MySQL zu erhalten.

Angenommen, Sie haben eine Tabelle product_sales(product, order_date,sale) die Verkaufsdaten für mehrere Produkte enthält.

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 |
+---------+------------+------+

Bonuslektüre:So erhalten Sie Datensätze mit maximalem Wert in MySQL

Angenommen, Sie möchten den letzten Datensatz in jeder Gruppe erhalten, d. h. für jedes Produkt. Zuerst verwenden wir GROUP BY, um das neueste Datum für jede Gruppe zu erhalten.

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

Jetzt, da wir das neueste Datum für jede Gruppe kennen, verbinden wir dieses Ergebnis mit unserer ursprünglichen Tabelle, um den neuesten Datensatz nach Datumsgruppe zu erhalten.

mysql> select product_sales.* from product_sales,
           (select product,max(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 |  150 |
| B       | 2020-05-03 |  250 |
| C       | 2020-05-03 | 1850 |
+---------+------------+------+

Bonuslektüre:So erstellen Sie eine Ansicht in MySQL

So wählen Sie den neuesten Datensatz für jeden Benutzer aus

Ebenso können Sie den neuesten Datensatz für jeden Benutzer auswählen oder den neuesten Datensatz für jede ID abrufen. Angenommen, Sie haben die folgende Tabelle user_data(user_id,transaction_date,sale) mit Benutzertransaktionsdaten

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-Lesetext:So gewinnen Sie neue Benutzer pro Tag in MySQL

Zuerst erhalten wir das späteste Datum für jede Benutzer-ID mit GROUP BY.

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

Da wir nun das neueste Datum für jede Benutzer-ID kennen, verbinden wir dieses Ergebnis mit unserer ursprünglichen Tabelle, um den neuesten Datensatz nach Benutzergruppe zu erhalten.

mysql> select user_data.* from user_data,
                (select user_id,max(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-03       |   15 |
|       2 | 2020-05-03       |   25 |
|       3 | 2020-05-03       |   50 |
+---------+------------------+------+

Hoffentlich können Sie den letzten Datensatz in jeder Gruppe in MySQL erhalten