【问题标题】:SQL Return rows based on value of other rowsSQL 根据其他行的值返回行
【发布时间】:2020-08-12 22:13:30
【问题描述】:

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

  • 当一个新的事务被放入时,数据库列Action被设置为“Insert”并且列Modified被设置为“No”。
  • 如果发生更新,将额外写入 2 行 Action = "Delete"; Modified = "是" AND Action = "插入"; Modified = “是”。
  • 如果事务被删除,则添加另一行:Action = "Delete"; Modified = “否”

这里有一些例子:

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

谢谢, 丹尼尔

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql select subquery greatest-n-per-group


【解决方案1】:

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

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'

【讨论】:

  • 谢谢。太棒了。我试图用 EXISTS 来解决这个问题,但这非常优雅。如果删除并不总是在更新的最后,你会如何解决它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多