Доступ к SQL-запросу: найдите строку с самой последней датой для каждой отдельной записи в таблице - PullRequest
7 голосов
/ 10 ноября 2009

Все,

Я уверен, что это довольно простой вопрос SQL-запроса, но я уверен, что есть хороший и очень плохой способ сделать это. Оставленный на мое усмотрение, я обязан в конечном итоге с последним. Итак ...

У меня есть таблица в Access с данными, которые выглядят так:

ID      Value  As_of
1173    156    20090601
1173    173    20081201
1173    307    20080901
1173    305    20080601
127     209    20090301
127     103    20081201
127     113    20080901
127     113    20080601
1271    166    20090201
1271    172    20081201
1271    170    20080901
1271    180    20080601
...

То, что я хотел бы получить, - это «Значение» для каждого уникального идентификатора с самой последней датой «По состоянию на» (в формате ГГГГММ).

Итак, мой набор результатов должен выглядеть так:

ID      Value    As_of
1173    156      20090601
127     209      20090301
1271    166      20090201

Обратите внимание, что разные идентификаторы будут иметь разные даты «как». Другими словами, я не могу просто определить самые последние из глобальных, а затем выбрать каждую строку с этой датой.

Для этой таблицы в общей сложности около 200 000 строк и около 10000 уникальных идентификаторов.

Большое спасибо заранее!

Ответы [ 5 ]

8 голосов
/ 10 ноября 2009

Если вам нужны и дата, и значение, вам нужно выполнить объединение:

SELECT ID, Value,As_of 
from yourTable a inner join 
          (SELECT ID, MAX(As_of) as As_of 
          from yourTable group by ID) b 
on a.ID=b.ID and a.As_of = b.As_of
4 голосов
/ 10 ноября 2009

@ Funka, это не сработает, если у вас есть повторяющиеся значения "value" для разных идентификаторов - это в основном даст вам сгруппированный список по "value", а не по id ...

@ Joe Fair, агрегаты недопустимы в выражениях where без подзапроса или со списком, по крайней мере, в ANSI ...

Это даст вам список, но также даст дубликаты, если у вас есть несколько строк с одинаковыми значениями id / As_of:

select  t1.id, t1.value, t1.As_of
from    tableName t1
join    (
        select  id as id, max(As_of) as max_as_of
        from    tableName
        group by id
    ) t2
on      t1.id = t2.id
and     t1.As_of = t2.max_as_of

Если вы хотите удалить дубликаты из этого списка, вам просто нужно добавить отличительный знак к верхнему выделению, например:

select  distinct t1.id, t1.value, t1.As_of
from    tableName t1
join    (
        select  id as id, max(As_of) as max_as_of
        from    tableName
        group by id
    ) t2
on      t1.id = t2.id
and     t1.As_of = t2.max_as_of
1 голос
/ 10 ноября 2009

Попробуйте что-то вроде этого

SELECT t1.*
FROM (SELECT Table1.ID, Max(Table1.As_Of) AS MaxOfAs_Of
FROM Table1
GROUP BY Table1.ID
)  AS MaxIDS INNER JOIN Table1 t1 ON MaxIDS.ID = t1.ID
and MaxIDS.MaxOfAs_Of = t1.As_Of
0 голосов
/ 10 ноября 2009

Я думаю, что вы ищете это:

выберите идентификатор, значение, as_of из table_name где as_of = max (as_of) сгруппировать по идентификатору

Здесь говорится для каждого идентификатора, найдите максимальное значение as_of и получите это значение.

Это общий sql. Я не уверен насчет доступа. Я уверен, что если это не сработает, есть что-то похожее.

Удачи! Джо

0 голосов
/ 10 ноября 2009

Не уверен, на какой платформе вы собираетесь это делать, но в T-SQL вы можете сделать следующее:

SELECT t.*
FROM (
    SELECT ID, MAX(As_Of) as r1
    FROM myTable
    GROUP BY ID
    ) as dt
INNER JOIN myTable t ON dt.ID = t.ID and dt.r1 = t.As_Of

Удачи!

РЕДАКТИРОВАТЬ: Ну, мой плохой ответ беспокоил меня, поэтому я исправил его, хотя этот ответ уже существует в другом месте на странице сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...