2014-12-27 4 views
1

Я искал, но не нашел ответа на мой вопрос.Получить последние N записей из таблицы

У меня есть таблица заказы, которая состоит из

  • идентификатора (первичный ключ Autonumber)
  • client_id: идентифицирует каждый клиент (уникальный)
  • даты: даты заказа для каждого клиента

Я хочу получить последние даты заказа N для каждого клиента в одном виде

Of cour se Я мог бы использовать SELECT TOP N date FROM orders WHERE client = 'xx' ORDER DESC, а затем использовать UNION для разных значений для клиента. Проблема заключается в том, что с изменениями в клиентской базе утверждение потребует пересмотра и что заявление UNION нецелесообразно с большой клиентской базой.

В качестве дополнительного требования это должно работать в Access SQL.

ответ

1

Шаг 1: Создайте запрос, который дает заказ на ранг по дате каждого клиента для каждой строки. Поскольку Access SQL не ROW_NUMBER() OVER (...) как SQL Server, вы можете смоделировать с помощью методики, описанной в следующем вопросе:

Если вы сделали шаг 1 правильно, результат должен быть следующим образом:

id client_id date  rank 
---------------------------------- 
     1  2014-12-01 7 
     1  2014-12-02 6 
     1  2014-12-05 5 
     1  2014-12-07 4 
     1  2014-12-11 3 
     1  2014-12-14 2 
     1  2014-12-15 1 
     2  2014-12-01 2 
     2  2014-12-02 1 
     ... 

Шаг 2: использовать результат со стадии 1 в качестве подзапроса и фильтрации результатов таким образом, что только записи сВозвращаются.

+0

Голосование, поскольку я собирался предложить то же самое –

1

Я думаю, что следующий будет работать в MS Access:

select t.* 
from table as t 
where t.date in (select top N t2.date 
       from table as t2 
       where t2.client_id = t.client_id 
       order by t2.date desc 
       ); 

Одна из проблем с MS Access является то, что top N будет получать больше, чем N записи, если есть связи. Если вы хотите точно «N», вы можете использовать order by date, id в подзапросе.

+0

Хорошая идея, но я думаю, вам нужно сделать сравнение WHERE на 'id', а не на' date'. Рассмотрим случай, когда три клиента заказывают «2014-12-01», но он только «релевантен» (т. Е. В течение последних пяти заказов) для двух из них. Ваш запрос вернет все три записи. – Heinzi

+0

@Heinzi. , , Я не понимаю ваш комментарий. Я думаю, что OP - это довольно четкие «последние N дат заказа для каждого клиента». Конечно, если OP означает 'id', а не' date' в определении «последние даты заказа N», то он/она может, конечно, использовать это поле. Что касается количества клиентов, то это связано с взаимодействием 'top' с' order by'. –

+0

А, я понимаю. Вы правы, конечно: я думал, что он хочет «последние даты заказа N» для каждого клиента * », то есть таблицу« client_id, date »с не более чем N записями для каждого client_id. Конечно, пример UNION, который он дает, приведет к «всем датам, которые относятся к последним пяти датам заказа для * любого * клиента». Ваш SQL отлично решает эту проблему. Я все еще верю, что он может действительно хотеть первую интерпретацию (что будет иметь больше смысла). – Heinzi

Смежные вопросы