2 votes

Comment sélectionner plusieurs colonnes avec un regroupement par une seule colonne ?

J'ai

Date         ID   Qty  
2019/5/1     A    11  
2019/6/1     A    22 
2019/7/1     B    33  
2019/6/1     B    44  

J'ai besoin des données d'ID et de Qté à Max(Date) de chaque ID comme ci-dessous

Date         ID   Qty  
2019/6/1     A    22
2019/7/1     B    33

J'utilise

select max(Date),ID,Qty from table group by ID,Qty  

mais le résultat n'est pas ce que j'attends

3voto

sebastianbrosch Points 3633

Vous pouvez utiliser la solution suivante :

SELECT t.* 
FROM table_name t INNER JOIN (
    SELECT MAX(Date) AS Date, ID 
    FROM table_name
    GROUP BY ID
) tMAX ON t.ID = tMAX.ID AND t.Date = tMAX.Date

Démonstration sur dbfiddle.uk

2voto

Mureinik Points 61228

group by n'est probablement pas le bon outil pour ce travail. Au lieu de cela, vous pouvez utiliser rank pour trouver la première ligne par groupe, et filtrer en fonction de celle-ci :

SELECT date, id, qty
FROM   (SELECT date, id, qty, RANK() OVER (PARTITION BY id ORDER BY date DESC) AS rk
        FROM   mytable) t
WHERE  rk = 1

1voto

Sreenu131 Points 2124

Essayez ceci

SELECT Date,
       ID,
       Qty 
FROM
(
SELECT Date,
       ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Date DESC) AS Grp,
       ID,
       Qty 
FROM <Table>
)Dt
WHERE Dt.Grp = 1

1voto

Zaynul Abadin Tuhin Points 12097

Vous pouvez utiliser une sous-requête corrélée

select t1.* from table_name t1
where date=( select max(date) from table_name t2 where t2.id=t1.id)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X