Ответ 1
Вы можете попробовать с подзапросом
select group, id, value, date from A where date in ( select MAX(date) as date from A group by group ) order by group
Хотя этот вопрос выглядит просто, это довольно сложно.
У меня есть таблица со следующими столбцами:
table A:
int ID
float value
datetime date
varchar(50) group
Я хотел бы получить "ID" и "значение" записей, которые содержат максимальную "дату", сгруппированную по столбцу "группа". Что-то вроде ", что является самым новым значением для каждой группы?
Я могу получить каждую группу и ее максимальную дату:
SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"
Но я хотел бы иметь "ID" и значение записи с наивысшей датой.
Создание JOIN между A и результатом может быть ответом, но нет способа узнать, к какой записи относится MAX (дата) (в случае повторения "даты" ).
Может кто-нибудь помочь?
Вы можете попробовать с подзапросом
select group, id, value, date from A where date in ( select MAX(date) as date from A group by group ) order by group
Это именно то, для чего были сделаны аналитические функции:
select group,
id,
value
from (
select group,
id,
value,
date,
max(date) over (partition by group) max_date_by_group
from A
)
where date = max_date_by_group
Если дата уникальна, у вас уже есть свой ответ. Если дата не уникальна, вам нужен еще один уникальный идентификатор. Отсутствие естественного ключа, ваш идентификатор не хуже любого. Просто поставьте MAX (или MIN, в зависимости от того, что вы предпочитаете):
SELECT *
FROM A
JOIN (
--Dedupe any non unqiue dates by getting the max id for each group that has the max date
SELECT Group, MAX(Id) as Id
FROM A
JOIN (
--Get max date for each group
SELECT group, MAX(date) as Date
FROM A
GROUP BY group
) as MaxDate ON
A.Group = MaxDate.Group
AND A.Date = MaxDate.Date
GROUP BY Group
) as MaxId ON
A.Group = MaxId.Group
AND A.Id= MaxId.Id
Пока столбец "Дата" уникален для каждой группы, я думаю, что что-то вроде этого может работать:
SELECT A.ID, A.Value
FROM A
INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B
ON A.Group = B.Group AND A.Date = B.MaxDate