Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回在给定日期最近更新的行_Sql_Oracle_Datetime_Max - Fatal编程技术网

Sql 返回在给定日期最近更新的行

Sql 返回在给定日期最近更新的行,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日)作为当前活动/有效条目的有效截止日期

我一直在进行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日)作为当前活动/有效条目的有效截止日期

这样,您就可以始终使用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