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 根据其他行的值返回行的主要内容,如果未能解决你的问题,请参考以下文章