【问题标题】:merging two date columns in oracle on 'select' and ordering on the merged column在'select'上合并oracle中的两个日期列并在合并列上排序
【发布时间】:2012-11-14 00:30:54
【问题描述】:

您好,我有一个选择查询,我从表中选择 2 个不同的日期列,我需要将它们合并到结果中的一列中,并按日期的降序排列。 查询如下所示:

select work_order_no,install_remove_type,removed_item_id,installed_item_id,
       removed_performed_on as irdate, 
       installed_performed_on as irdate 
  from install_remove_items 
 where work_order_no is not null  
   and (installed_item_id = 'IID000174096' or removed_item_id= 'IID000174096')

上面查询的结果是创建了2列

irdate - 用于removed_performed_on

irdate_1 - 用于 installed_performed_on

这不是我想要的方式。我如何在“irdate”列中获得与日期相关的数据并按 desc 顺序排序?

更新:

install_remove_items 表中的示例数据(INSTALL_REMOVE_TYPE 字段中 4 种操作类型的 4 条记录):

 ir_id: xxxxyyyy5555,  install_remove_type= 'INSTALL', workOrderno = 22335522, installed_item_id = IID000174096, installed_performed_on = '11/10/2012', removed_item_id = null, removed_performed_on = null.

 ir_id: xxxxyyyy3333, install_remove_type= 'REMOVE', workOrderno = 223542, installed_item_id = null, installed_performed_on = null, removed_item_id = IID000174096, removed_performed_on = '11/12/2012'.

 ir_id: xxxxyyyy1111,  install_remove_type= 'WORKEDON', workOrderno = 111111, installed_item_id = null, installed_performed_on = null, removed_item_id = IID000174096, removed_performed_on = '11/13/2012'.

 ir_id: xxxxyyyy2222, install_remove_type= 'REPLACED', workOrderno = 444444, installed_item_id = IID000174096, installed_performed_on = 11/15/2012, removed_item_id = IID000174096, removed_performed_on = '11/14/2012'.

因此有 4 种类型的操作,“删除”字段用于 REMOVE 操作,“安装”字段用于安装操作,两个字段用于 REPLACED 操作,“已删除”字段用于 WORKEDON 操作。

我想编写一个查询,以根据 install_performed_on 和 removed_performed_on 日期(并获取该日期)查找最后执行的四种操作中的哪种操作(与今天的日期或输入日期值相比)。

希望这能让事情变得清晰。

我知道 union 可能很好,但目前我们为 SQL 提供的 Java API 不支持 union,所以我可能需要结合 SQL 和 JAVA 代码来实现我的输出。

提前致谢。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    如果没有放置您想要的示例数据,它并不完全清楚您想要什么。但会是这样吗?

    select *
      from (select work_order_no,install_remove_type,installed_item_id,
                       installed_performed_on as irdate 
                  from install_remove_items 
                 where work_order_no is not null  
                   and installed_item_id = 'IID000174096'
                union all
                select work_order_no,install_remove_type,removed_item_id,
                       removed_performed_on as irdate
                  from install_remove_items 
                 where work_order_no is not null  
                   and removed_item_id= 'IID000174096')
             order by irdate desc;
    

    根据您的示例修改:

    SQL> select *
      2    from (select workOrderno, install_remove_type,
      3                 case
      4                   when installed_performed_on > removed_performed_on
      5                     or removed_performed_on is null then ir.installed_performed_on
      6                   else removed_performed_on
      7                 end last_action_date,
      8                 coalesce(ir.installed_item_id,ir.removed_item_id)  item_id
      9            from install_remove_items ir
     10           where workOrderno is not null
     11             and (installed_item_id = 'IID000174096' or removed_item_id= 'IID000174096')
     12           order by last_action_date desc )
     13   where rownum = 1
     14  /
    
    WORKORDERNO INSTALL_RE LAST_ACTI ITEM_ID
    ----------- ---------- --------- --------------------
         444444 REPLACED   15-NOV-12 IID000174096
    

    或者你可以这样做的每个项目的列表:

    SQL> select * from install_remove_items;
    
    IR_ID                INSTALL_RE WORKORDERNO INSTALLED_ITEM_ID    INSTALLED REMOVED_ITEM_ID      REMOVED_P
    -------------------- ---------- ----------- -------------------- --------- -------------------- ---------
    xxxxyyyy5555         INSTALL       22335522 IID000174096         10-NOV-12
    xxxxyyyy3333         REMOVE          223542                                IID000174096         12-NOV-12
    xxxxyyyy1111         WORKEDON        111111                                IID000174096         13-NOV-12
    xxxxyyyy2222         REPLACED        444444 IID000174096         15-NOV-12 IID000174096         14-NOV-12
    3242                 REMOVE              43                                IID000174097         14-DEC-12
    123                  INSTALL            123 IID000174097         15-NOV-12
    
    6 rows selected.
    
    SQL> select workorderno, install_remove_type, item_id, last_action_date
      2    from (select l.*,
      3                  row_number() over(partition by item_id order by last_action_date desc) rn
      4             from (select workorderno, install_remove_type,
      5                           case
      6                             when installed_performed_on > removed_performed_on or
      7                                  removed_performed_on is null then
      8                              ir.installed_performed_on
      9                             else
     10                              removed_performed_on
     11                           end last_action_date,
     12                           coalesce(ir.installed_item_id, ir.removed_item_id) item_id
     13                      from install_remove_items ir
     14                     where workorderno is not null) l)
     15   where rn = 1;
    
    WORKORDERNO INSTALL_RE ITEM_ID              LAST_ACTI
    ----------- ---------- -------------------- ---------
         444444 REPLACED   IID000174096         15-NOV-12
             43 REMOVE     IID000174097         14-DEC-12
    

    【讨论】:

    • 谢谢,差不多了。我想要的是 install_remove_items 表中与“installed_performed_on”和“removed_performed_on”相比最接近的记录(实际上是最后发生的事件 - 安装/删除)。想知道我们是否可以使这个查询更简洁
    • 如果可能的话,我认为如果您显示一些示例输入 + 输出数据会有所帮助。
    • 谢谢。所以在你的样本数据中......答案应该被替换吧?查看修改后的答案
    • 感谢 DazzaL,这正是我需要的输出。我现在在 sql 编辑器中使用此查询,但无法在 jaffa persistence api 中使用它,因为我不支持这种情况。我同意在不使用这些命令的情况下不可能在单个查询中执行此操作,对于代码,我正在运行 2 个不同的标准,一个用于“删除”字段,一个用于“安装”字段,并使用 java 中的数据比较从结果。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2021-10-06
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多