SQL 需要根据状态获取最新记录吗?
SQL needed for getting latest records based on Status?
我有一个 table TRX,对于给定的 SRCID 示例数据集,它具有多个值 TRXID,如下所示。
TRXID STATUS TIMESTAMP SRCID
839 EN 30-OCT-14 11.08.13.597000000 AM B0D35D0168G
1189 MO 30-OCT-14 11.13.19.554000000 AM B0D35D0168G
1549 CA 30-OCT-14 12.13.42.246000000 PM B0D35D0168G
1666 EN 30-OCT-14 02.43.22.271000000 PM A0D77E2168G
2221 CA 30-OCT-14 05.49.16.712000000 PM A0D77E2168G
2244 EN 31-OCT-14 11.21.18.146000000 AM A0D77E2168G ...
我想获取所有具有最新状态的 SRCID = 'CA' 仅基于最新的 TIMESTAMP。
因此,例如,如果我们 运行 查询上述数据集,我们只会得到 'B0D35D0168G' 作为结果。
这将适用于 Oracle:
SELECT srcid FROM (
SELECT srcid, status, ROW_NUMBER() OVER ( PARTITION BY srcid ORDER BY timestamp DESC ) AS rn
FROM trx
) WHERE status = 'CA' AND rn = 1;
如果您还需要检索其他列(例如,如果您需要知道 timestamp
的最后一个值是什么),它会起作用。
SELECT trxid, srcid, timestamp FROM (
SELECT trxid, srcid, timestamp, status, ROW_NUMBER() OVER ( PARTITION BY srcid ORDER BY timestamp DESC ) AS rn
FROM trx
) WHERE status = 'CA' AND rn = 1;
这是我已经成功使用多年的 "most recent" 模式。如果key和date字段组成一个索引,真的很快
select *
from trx t1
where t1.status = 'CA'
and t1.timestamp =(
select Max( timestamp )
from trx
where status = t1.status
and timestamp <= SysDate );
如果未来的日期不可能,则可以省略子查询的最后一行。无论哪种方式,查询都应该只执行索引查找。
我有一个 table TRX,对于给定的 SRCID 示例数据集,它具有多个值 TRXID,如下所示。
TRXID STATUS TIMESTAMP SRCID
839 EN 30-OCT-14 11.08.13.597000000 AM B0D35D0168G
1189 MO 30-OCT-14 11.13.19.554000000 AM B0D35D0168G
1549 CA 30-OCT-14 12.13.42.246000000 PM B0D35D0168G
1666 EN 30-OCT-14 02.43.22.271000000 PM A0D77E2168G
2221 CA 30-OCT-14 05.49.16.712000000 PM A0D77E2168G
2244 EN 31-OCT-14 11.21.18.146000000 AM A0D77E2168G ...
我想获取所有具有最新状态的 SRCID = 'CA' 仅基于最新的 TIMESTAMP。 因此,例如,如果我们 运行 查询上述数据集,我们只会得到 'B0D35D0168G' 作为结果。
这将适用于 Oracle:
SELECT srcid FROM (
SELECT srcid, status, ROW_NUMBER() OVER ( PARTITION BY srcid ORDER BY timestamp DESC ) AS rn
FROM trx
) WHERE status = 'CA' AND rn = 1;
如果您还需要检索其他列(例如,如果您需要知道 timestamp
的最后一个值是什么),它会起作用。
SELECT trxid, srcid, timestamp FROM (
SELECT trxid, srcid, timestamp, status, ROW_NUMBER() OVER ( PARTITION BY srcid ORDER BY timestamp DESC ) AS rn
FROM trx
) WHERE status = 'CA' AND rn = 1;
这是我已经成功使用多年的 "most recent" 模式。如果key和date字段组成一个索引,真的很快
select *
from trx t1
where t1.status = 'CA'
and t1.timestamp =(
select Max( timestamp )
from trx
where status = t1.status
and timestamp <= SysDate );
如果未来的日期不可能,则可以省略子查询的最后一行。无论哪种方式,查询都应该只执行索引查找。