Sql 返回在给定日期最近更新的行
我一直在进行SQL/Oracle查询 对于这个问题,感兴趣的字段是effective\u daytd.ws\u date、ot.valid\u from和ot.valid\u to 每个生效日返回一条记录。只要在生效日当天或之前以及生效日当天或之后对记录进行了编辑,该记录就是有效的。 为了找出它何时有效,我们查看字段sot.valid\u from和ot.valid\u ToSql 返回在给定日期最近更新的行,sql,oracle,datetime,max,Sql,Oracle,Datetime,Max,我一直在进行SQL/Oracle查询 对于这个问题,感兴趣的字段是effective\u daytd.ws\u date、ot.valid\u from和ot.valid\u to 每个生效日返回一条记录。只要在生效日当天或之前以及生效日当天或之后对记录进行了编辑,该记录就是有效的。 为了找出它何时有效,我们查看字段sot.valid\u from和ot.valid\u To ot.valid_from为避免类似问题,请使用未来日期(如9999年12月31日)作为当前活动/有效条目的有效截止日期
ot.valid_from为避免类似问题,请使用未来日期(如9999年12月31日)作为当前活动/有效条目的有效截止日期 这样,您就可以始终使用between来查找最新条目。此外,ORDER BY将正确运行 如果无法更改此项,请创建一个视图,用所选日期替换null:
select ..., coalesce(valid_to, to_timestamp('31-DEC-9999', 'DD-MON-YYYY')), ....
在where子句中使用子查询,如下所示
Where ot.ID =
(select max(in1.ID)
from ws_tracker_old_tab in1 where in1.Order=ot.Order
and in1.VALID_FROM = (select max(in2.VALID_FROM)
from ws_tracker_old_tab in2
where in2.Order =in1.Order
and in2.VALID_FROM <= td.WS_DATE
and (in2.VALID_UNTIL IS NULL or in2.VALID_UNTIL>=td.ws_date))
如果您知道每个订单的有效起始日期总是唯一的,那么您可以简化一下:
Where ot.VALID_FROM = (select max(in1.VALID_FROM)
from ws_tracker_old_tab in1
where in1.Order = ot.Order
and in1.VALID_FROM <= td.WS_DATE
and (in1.VALID_UNTIL IS NULL or in1.VALID_UNTIL>=td.ws_date))
处理valid_from和valid_to最简单的方法是忽略valid_to:因为在这种情况下,它是一个派生值,通常不应该存储在数据库中 话虽如此,我相信以下几点对你来说应该有用:
WITH max_stamp(effective_date, order_no, stamp) as (
SELECT a.ws_date, b.order_no, b.MAX(b.valid_from)
FROM ws_tracker_dates_tab a
JOIN ws_tracker_old_tab b
ON b.valid_from < CAST((a.ws_date + INTERVAL '1' DAY) AS TIMESTAMP)
WHERE a.ws_date BETWEEN (SYSDATE - 30) AND (SYSDATE)
GROUP BY a.ws_date, b.order_no)
SELECT a.*, b.effective_date
FROM ws_tracker_old_tab a
JOIN max_stamp b
ON b.stamp = a.valid_from
AND b.order_no = a.order_no
请注意,我使用的是DB2,还没有使用Oracle,因此可能需要进行一些调整 我假设你指的是ot.valid\u**from**您好,是的,这是正确的。您好,是的,我无法更改这一点,这些表不是由我创建的,我只是从它们创建一个视图,因此我将使用您的建议。谢谢
Where ot.VALID_FROM = (select max(in1.VALID_FROM)
from ws_tracker_old_tab in1
where in1.Order = ot.Order
and in1.VALID_FROM <= td.WS_DATE
and (in1.VALID_UNTIL IS NULL or in1.VALID_UNTIL>=td.ws_date))
WITH max_stamp(effective_date, order_no, stamp) as (
SELECT a.ws_date, b.order_no, b.MAX(b.valid_from)
FROM ws_tracker_dates_tab a
JOIN ws_tracker_old_tab b
ON b.valid_from < CAST((a.ws_date + INTERVAL '1' DAY) AS TIMESTAMP)
WHERE a.ws_date BETWEEN (SYSDATE - 30) AND (SYSDATE)
GROUP BY a.ws_date, b.order_no)
SELECT a.*, b.effective_date
FROM ws_tracker_old_tab a
JOIN max_stamp b
ON b.stamp = a.valid_from
AND b.order_no = a.order_no