选择一行中的行对SQL

问题描述 投票:1回答:4

所以我有这个事件审计表

EventID | EventType | TaskID |   Date             | Iteration
--------------------------------------------------------------
   1    |  start    |   12   |  01/01/2016 09:00  |    1     
--------------------------------------------------------------
   2    |  ended    |   12   |  01/01/2016 09:05  |    1     
--------------------------------------------------------------
   3    |  start    |   14   |  01/01/2016 09:10  |    1     
--------------------------------------------------------------
   4    |  ended    |   14   |  01/01/2016 09:15  |    1
--------------------------------------------------------------
   5    |  start    |   12   |  01/01/2016 09:20  |    2
--------------------------------------------------------------
   6    |  ended    |   12   |  01/01/2016 09:20  |    2
--------------------------------------------------------------
   7    |  ended    |   98   |  01/01/2016 07:14  |    12
--------------------------------------------------------------
   8    |  start    |   66   |  01/01/2016 09:27  |    1

大多数是具有不同迭代的任务的开始/结束事件对。但有时只有开始或只有结束的行。

我想得到什么:

| TaskID |   Date Started     |   Date ended        |     Iteration 
----------------------------------------------------------------------
|   12   |  01/01/2016 09:00  |    01/01/2016 09:05 |          1     
----------------------------------------------------------------------
|   14   |  01/01/2016 09:10  |    01/01/2016 09:15 |          1
----------------------------------------------------------------------
|   12   |  01/01/2016 09:20  |    01/01/2016 09:20 |          2
----------------------------------------------------------------------
|   98   |         -          |    01/01/2016 07:14 |          12
----------------------------------------------------------------------
|   66   |  01/01/2016 09:27  |        -            |          1

我怎样才能做到这一点?

Oracle 11g

sql oracle partitioning
4个回答
2
投票

试试这个:测试数据

   with t(EventID,  
     EventType,
        TaskID,
        Dates,
        Iteration) as
         (select 1,
                 'start',
                 12,
                 to_date('01/01/2016 09:00', 'mm/dd/yyyy hh24:mi'),
                 1
            from dual
          union all
          select 2,
                 'ended',
                 12,
                 to_date('01/01/2016 09:05', 'mm/dd/yyyy hh24:mi'),
                 1
            from dual
          union all
          select 3,
                 'start',
                 14,
                 to_date('01/01/2016 09:10', 'mm/dd/yyyy hh24:mi'),
                 1
            from dual
          union all
          select 4,
                 'ended',
                 14,
                 to_date('01/01/2016 09:15', 'mm/dd/yyyy hh24:mi'),
                 1
            from dual
          union all
          select 5,
                 'start',
                 12,
                 to_date('01/01/2016 09:20', 'mm/dd/yyyy hh24:mi'),
                 2
            from dual
          union all
          select 6,
                 'ended',
                 12,
                 to_date('01/01/2016 09:20', 'mm/dd/yyyy hh24:mi'),
                 2
            from dual
          union all
          select 7,
                 'ended',
                 98,
                 to_date('01/01/2016 07:14', 'mm/dd/yyyy hh24:mi'),
                 12
            from dual
          union all
          select 8,
                 'start',
                 66,
                 to_date('01/01/2016 09:27', 'mm/dd/yyyy hh24:mi'),
                 1
            from dual)

询问

    select TaskID,
           min(case EventType
                 when 'start' then
                  dates
               end),
           max(case EventType
                 when 'ended' then
                  dates
               end),
           Iteration
      from t
     group by TaskID, Iteration

如果你想要' - '符号,那就试试吧

 nvl(to_char(min(case EventType
             when 'start' then
              dates
           end),'mm/dd/yyyy hh24:mi'),'       -')

2
投票

我认为这可以使用自联接:

SELECT tBase.EventId,
       tStarted.Date as DateStarted,
       tEnded.Date as DateEnded,
       tBase.Iteration
FROM  <eventAuditTable> tBase
LEFT JOIN <eventAuditTable> tStarted ON tStarted.eventType = 'Started'
       and tStarted.TaskId = tBase.TaskId
       and tStarted.Iteration = tBase.Iteration
LEFT JOIN <eventAuditTable> tEnded ON tEnded.eventType = 'Ended'
       and tBase.TaskId = tEnded.TaskId
       and tBase.Iteration = tEnded.Iteration

将名称<eventAuditTable>更改为真实姓名并尝试一下!


0
投票

您还可以使用GROUP BY查询来获得相同的结果:

select TaskId,
       MIN(CASE WHEN EventType = 'start' THEN Date END) as DateStarted,
       MAX(CASE WHEN EventType = 'ended' THEN Date END) as DateEnded,
       MAX(Iteration) as Iteration

from TEvent 
GROUP BY TaskID
ORDER BY TaskID

0
投票

试试这个,只需一个简单的全外连接即可。您可以选择任何您想要的开始或结束的迭代或两者的总和。

select a.TaskID ,a.Date_Started,b.Date_ended,a.Iteration ,b.Iteration    
from event_audit a full outer join event_audit b 
on a.TaskID=b.TaskID;
© www.soinside.com 2019 - 2024. All rights reserved.