Нужна помощь с запросом SQL, который возвращает последние записи, соответствующие определенным критериям - PullRequest
1 голос
/ 08 октября 2010

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

CREATE TABLE "posting" (
    "id" integer NOT NULL PRIMARY KEY,
    "amount" real NOT NULL,
    "balance" real NOT NULL,
    "account_id" integer NOT NULL REFERENCES "account" ("id"),
    "asset_type_id" integer NOT NULL REFERENCES "asset_type" ("id")        
)

Для этой таблицы я вручную генерирую идентификаторы таким образом, чтобы не было пробелов (записи не могут быть удалены). Гарантируется, что следующий оператор вернет самую последнюю запись:

SELECT * FROM posting ORDER BY id DESC LIMIT 1

Проблема в том, что теперь мне нужно получить не только последнюю, но и последнюю запись для каждой комбинации «account_id» и «asset_type_id». Например, допустим, у меня есть два «account» и два «asset_types» (оба с идентификаторами 1 и 2) и следующие записи (без учета количества и баланса):

id | account_id | asset_type_id 
1  |    1       |    1
2  |    2       |    1
3  |    1       |    2
4  |    2       |    1
5  |    2       |    2
6  |    2       |    2

Он вернет мне записи 6, 4, 3 и 1, поскольку записи 5 и 2 были «заменены» на 6 и 4 соответственно. Я понятия не имею, как представить это в SQL, любая помощь приветствуется.

Ответы [ 3 ]

6 голосов
/ 08 октября 2010

Что вам нужно посмотреть, так это наибольшее значение идентификатора для группы account_id и asset_type_id

ВЫБЕРИТЕ МАКС. (ID), account_id, asset_type_id ОТ группы проводок по account_id, asset_type_id;

Таблица

id | account_id | asset_type_id 
1  |    1       |    1
2  |    2       |    1
3  |    1       |    2
4  |    2       |    1
5  |    2       |    2
6  |    2       |    2

После группы

id | account_id | asset_type_id 
1   |    1       |    1
2,4 |    2       |    1
3   |    1       |    2
5,6 |    2       |    2

После Макс

id | account_id | asset_type_id 
1  |    1       |    1
3  |    1       |    2
4  |    2       |    1
6  |    2       |    2

EDIT:

Q2: Как выполнить этот запрос без использования всей таблицы?

Оператор выбора SQL имеет несколько этапов, которые выполняются в определенном порядке, каждый из которых создает временную таблицу ввода для следующего этапа.

(5) SELECT (5-2) DISTINCT (5-3) TOP (<top specification>) 
(5-1) <select clauses>
(1) FROM (1-J) <left table> <connection type> JOIN <right table> ON <predicates of on clause>
<alias>
(2) WHERE <predicates of where clause>
(3) GROUP BY <grouping specification>
(4) HAVING <predicates of having clause>
(6) ORDER BY <list specifying the order>

Поскольку вы видите, что первым шагом является FROM, который в вашем случае представляет собой одну таблицу, тогда мы переходим к WHERE, поэтому, когда вы добавите сюда некоторые предикаты, например account_id between 1 and 10 AND asset_type_id between 1 and 10, вы будете работать только с этим куском таблицы на шаге 3 это группа по.

0 голосов
/ 08 октября 2010

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

select *
from posting
where id in
    (
    select max(id)
    from   posting
    group
    by     account_id,
           asset_type_id
    )
0 голосов
/ 08 октября 2010

Это работает в MySQL

select * from (select * from posting order by id desc) as a group by account_id, asset_type_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...