SQL根据其他行的值返回行

问题描述 投票:0回答:1

我们使用数据库来捕获交易/交易,我需要找出哪一个是最新的交易。

  • 当进行新事务时,数据库列Action设置为“插入”,列Modified设置为“否”。
  • 如果发生更新,将另外写入2行Action =“ Delete”;Modified=“是”且Action =“插入”;Modified=“是”。
  • [如果删除交易,则添加另一行:Action =“ Delete”;Modified=“否”

以下是一些示例:

  • 仅插入交易A。因此,我需要返回Record 1。
  • 交易B已插入并更新。我需要查询返回Record 4。
  • 交易C已插入并删除。查询根本不应该返回交易C。
  • 交易D已插入并更新了两次。我需要返回Record 11。
  • 交易E已插入,已更新两次,然后删除。该查询根本不应返回交易E。

Sample Deals

谢谢,丹尼尔

sql select greatest-n-per-group
1个回答
0
投票

[If我正确地关注了您,您可以使用子查询过滤每个交易的最新记录,然后忽略最后一个状态为删除的交易:

select t.*
from mytable t
where 
    t.record = (select max(t1.record) from mytable t1 where t1.dealID = t.dealID)
    and t.action <> 'Delete'

就您而言,您不需要使用列modified即可获得所需的结果。

为了获得此查询的性能,请考虑(dealID, record, action)上的索引。

如果数据库支持窗口功能,也可以用row_number()表示:

select record, action, modified, dealID
from (
    select t.*, row_number() over(partition by dealID order by record desc) rn
    from mytable t
) t
where action <> 'Deleted'
© www.soinside.com 2019 - 2024. All rights reserved.