需要有关返回符合特定条件的持续记录的SQL查询的帮助

时间:2010-10-08 16:48:25

标签: sql postgresql

我有下表:

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中表示这一点,任何帮助都表示赞赏。

3 个答案:

答案 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
    )