我有下表:
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")
)
对于此表,我以无间隙(无法删除记录)的方式手动生成ID。保证以下声明将返回最新记录:
SELECT * FROM posting ORDER BY id DESC LIMIT 1
现在的问题是,我现在不仅需要检索“account_id”和“asset_type_id”的每个组合的最后一条记录,还要检索最后一条记录。例如,假设我有两个'帐户'和两个'asset_types'(都带有ID 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中表示这一点,任何帮助都表示赞赏。
答案 0 :(得分:6)
您需要查看的是account_id和asset_type_id组的最大ID值
SELECT MAX(ID),account_id,asset_type_id FROM 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
Max
之后id | account_id | asset_type_id
1 | 1 | 1
3 | 1 | 2
4 | 2 | 1
6 | 2 | 2
修改强>
Q2:如何在不使用整个表的情况下运行此查询?
SQL select语句有一些阶段按特定顺序完成,每个阶段都为下一阶段创建一个临时输入表。
(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步是分组。
答案 1 :(得分:0)
这适用于mysql
select * from (select * from posting order by id desc) as a group by account_id, asset_type_id;
答案 2 :(得分:0)
使用按帐户ID和资产类型分组的子查询,并为每个组选择最大ID。然后确保id在该子查询中。我没有测试过,但我认为这应该有效:
select *
from posting
where id in
(
select max(id)
from posting
group
by account_id,
asset_type_id
)