Как найти запись в таблице, которая содержит максимальное значение? - PullRequest
11 голосов
/ 18 декабря 2008

Хотя этот вопрос выглядит простым, он довольно сложен.

У меня есть таблица со следующими столбцами:

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" и значение записи с самой высокой датой.

Создание соединения между A и результатом может быть ответом, но нет способа узнать, к какой записи относится MAX (дата) (в случае, если «дата» повторяется).

Может кто-нибудь помочь?

Ответы [ 4 ]

8 голосов
/ 18 декабря 2008

Вы можете попробовать с подзапросом

select group, id, value, date from A where date in
( select MAX(date) as date
  from A
  group by group )
order by group
4 голосов
/ 18 декабря 2008

Это то, для чего были созданы аналитические функции:

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
2 голосов
/ 18 декабря 2008

Если дата уникальна, значит, у вас уже есть ответ. Если дата не уникальна, то вам нужен какой-то другой уникализатор. Если нет естественного ключа, ваш идентификатор так же хорош, как и любой другой. Просто поместите МАКС (или МИНУТ, в зависимости от того, что вы предпочитаете):

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
0 голосов
/ 18 декабря 2008

Пока столбец «Дата» уникален для каждой группы, я думаю, что-то вроде этого может работать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...