Как выбрать несколько столбцов с группой по одному столбцу

#sql #sql-server #select

#sql #sql-сервер #выберите

Вопрос:

У меня есть..

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

Мне нужны данные идентификатора и максимальное количество (дата) каждого идентификатора, как показано ниже

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

Я использую..

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

но результат не тот, который я ожидаю

Ответ №1:

Вы можете использовать следующее решение:

 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
  

демонстрация на dbfiddle.uk

Ответ №2:

group by вероятно, это неподходящий инструмент для этой работы. Вместо этого вы могли бы использовать rank для поиска верхней строки для каждой группы и фильтрации в соответствии с ней:

 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
  

Комментарии:

1. большое вам спасибо. это работа, но я не понимаю код

2. это объясняется в блоге здесь: coding.feron.it/2012/08 /…

Ответ №3:

Попробуйте это

 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
  

Ответ №4:

вы можете использовать коррелированный подзапрос

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