SQL Return 行基于其他行的值
SQL Return rows based on value of other rows
我们使用数据库来捕获交易/交易,我需要找出哪一个是最新的交易。
- 当一个新事务被放入时,数据库列
Action
被设置为"Insert"并且列Modified
被设置为"No"。
- 如果发生更新,将写入另外 2 行
Action
= "Delete"; Modified
= "Yes" 和 Action
= "Insert"; Modified
= "Yes".
- 如果一个事务被删除,则添加另一行:
Action
= "Delete"; Modified
= "No"
这里有一些例子:
- 只插入了交易 A。因此,我需要 return
Record
1.
- 交易 B 已插入并更新。我需要查询 return
Record
4.
- 交易 C 已插入并删除。查询不应该 return 处理 C。
- 交易 D 已插入并更新了两次。我需要
Record
11 才能 returned。
- 交易 E 已插入,更新两次,然后删除。查询不应该 return 交易 E。
谢谢,
丹尼尔
如果我没听错,你可以用子查询过滤每笔交易的最新记录,然后忽略最后状态为删除的交易:
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)
.
上的索引
如果您的数据库支持 window 函数,您也可以用 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'
我们使用数据库来捕获交易/交易,我需要找出哪一个是最新的交易。
- 当一个新事务被放入时,数据库列
Action
被设置为"Insert"并且列Modified
被设置为"No"。 - 如果发生更新,将写入另外 2 行
Action
= "Delete";Modified
= "Yes" 和Action
= "Insert";Modified
= "Yes". - 如果一个事务被删除,则添加另一行:
Action
= "Delete";Modified
= "No"
这里有一些例子:
- 只插入了交易 A。因此,我需要 return
Record
1. - 交易 B 已插入并更新。我需要查询 return
Record
4. - 交易 C 已插入并删除。查询不应该 return 处理 C。
- 交易 D 已插入并更新了两次。我需要
Record
11 才能 returned。 - 交易 E 已插入,更新两次,然后删除。查询不应该 return 交易 E。
谢谢, 丹尼尔
如果我没听错,你可以用子查询过滤每笔交易的最新记录,然后忽略最后状态为删除的交易:
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)
.
如果您的数据库支持 window 函数,您也可以用 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'