基于特定记录命中和更新计时的数据过滤

时间:2017-02-21 06:05:44

标签: sql database oracle plsql

我有一张以下性质的表格。此表所在的数据库上的事务处理遵循一个路径,在该路径中,用户可以更改一个,多个或所有项的交付日期。现在,我想要的是一组行,用户更新对应于特定项目的交付日期。您可以看到PO_Number对于所有项目都是相同的,因此PO_Date也是如此。那么,如何查询和显示所需的行?

PO_NO        PO_DT      ITEM_CODE  DEL_DATE  UPDATED_ON   OLD_DEL_DATE     NEW_DEL_DATE
======================================================================================== 
01T0012384  20/05/2015  UP01662   24/06/2015  23/5/2015     20/06/2015      24/06/2015
01T0012384  20/05/2015  UP01762   22/06/2015  21/5/2015     20/06/2015      22/06/2015   
01T0012384  20/05/2015  UP01661   24/06/2015  23/5/2015     20/06/2015      24/06/2015 
01T0012384  20/05/2015  UP01763   22/06/2015  21/5/2015     20/06/2015      22/06/2015

如果用户执行了他的上一次交易并更新了item_code-(UP01662,UP01661)的交付日期,请考虑一天(例如)第10次。然后最后我想要的只是一个查询,它只为这两个项目提取数据集,而不是其他任何内容。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

我认为这可能对你有点https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a0742b7-b976-42b7-8230-4ae46441a63a/when-was-the-last-time-a-record-was-addedmodified-in-a-sql-table?forum=transactsql

 declare @objectid int
    select @objectid = object_id from sys.objects where name = 'YOURTABLENAME'

    select top 1 * from sys.dm_db_index_usage_stats where object_id = @objectid
    and last_user_update is not null
    order by last_user_update

答案 1 :(得分:0)

我们的想法是创建自定义函数以检查是否有任何列被更改以及更新后的触发器。如果您知道某些列必须始终随每次更新而更改,那么更容易检查您的行是否已更改 - 否则您必须检查user_tab_columns中所有列的列。

对于通用方法,请检查: https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:59412348055

答案 2 :(得分:0)

如果您需要,请告诉我。

create table xx_ap_orders (  po_number varchar2(10)
                            , item_code  varchar2(10)
                            , amount number
                            , updated_date date
                           );

所以,情景是:

所有记录都在5天前更新

带有MOUSE项目代码的

行已于4天前更新

CABLE和BATERY项目代码在2天前更新。

表格中的记录如下:

insert into xx_ap_orders values ('PO_500','LAPTOP', 3500, trunc (sysdate - 5) );
insert into xx_ap_orders values ('PO_500','MOUSE',   200, trunc (sysdate - 4) );
insert into xx_ap_orders values ('PO_500','CABLE',   100, trunc (sysdate - 2) );
insert into xx_ap_orders values ('PO_500','BATERY',  500, trunc (sysdate - 2) );

如果您只想选择CABLE和BATERY记录(上次更新),您可以使用以下SQL:

SELECT * FROM (
SELECT po_number
       , item_code
       , amount
       , updated_date
       , rank() OVER (PARTITION BY po_number
                     order by updated_date desc) rank_updated
FROM XX_AP_ORDERS)
WHERE rank_updated = 1
;