SQL 根据其他行的值返回行

Posted

技术标签:

【中文标题】SQL 根据其他行的值返回行【英文标题】:SQL Return rows based on value of other rows 【发布时间】: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。

谢谢, 丹尼尔

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案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 来解决这个问题,但这非常优雅。如果删除并不总是在更新的最后,你会如何解决它?

以上是关于SQL 根据其他行的值返回行的主要内容,如果未能解决你的问题,请参考以下文章

根据行中的值,使用值更新SQL行的最快方法是什么?

根据R中现有行的值插入行

使用不同的表触发检查条件,然后根据结果更改插入行的值

Apache Beam 根据前一行的值更新当前行的值

根据条件将单个数据行拆分为多个数据行的 SQL 脚本

Db2 SQL 根据大量数据选择排除行的行