在条件中获取oracle中的前一行

时间:2018-04-27 15:02:52

标签: oracle10g

如果我有一个具有以下表结构(id,username,send_date,message)的表,如何通过Oracle SQL为不同的用户获取以前的消息

假设我有以下数据

id,  username,  send_date            ,message
1,   user A  ,  12.02.2018 10:08:05 ,'problem 1'
2,   user B  ,  12.02.2018 11:34:12 ,'what ?'
3,   user B  ,  12.02.2018 14:12:02 ,'try this'
4,   user A  ,  13.02.2018 09:29:23 ,'see here'
5,   user B  ,  13.02.2018 13:34:12 ,'do this'

我该怎么做呢

id,  username,  send_date            ,message       ,reply_to
1,   user A  ,  12.02.2018 10:08:05  ,'problem 1'   ,null
2,   user B  ,  12.02.2018 11:34:12  ,'what ?'      ,'problem1'
3,   user B  ,  12.02.2018 14:12:02  ,'try this'    ,'problem 1'
4,   user A  ,  13.02.2018 09:29:23  ,'see here'    ,'try this'
5,   user B  ,  13.02.2018 13:34:12  ,'do this'     ,'see here'

我的查询

select m.id, m.username, send_date, m.message, 
       lag(m.message) over (order by M.SEND_DATE)  reply_to
  from ts_messages m 
  order by m.send_date

返回此

  id,  username ,send_date            ,message     ,reply_to
    1, user A   ,12.02.2018 10:08:05 ,'problem 1'  ,null
    2, user B   ,12.02.2018 11:34:12 ,'what ?'     ,'problem1'
    3, user B   ,12.02.2018 14:12:02 ,'try this'   ,'**what?**'
    4, user A   ,13.02.2018 09:29:23 ,'see here'   ,'try this'
    5, user B   ,13.02.2018 13:34:12 ,'do this'    ,'see here'

基本上,我需要在编写回复时显示我正在回复的消息,这应该是由我以外的其他人写的上一条消息

1 个答案:

答案 0 :(得分:0)

这是一个返回所需结果的选项;但是,因为它多次访问源表,所以似乎并不高效。但是,如果那里没有那么多行,你可能会发现与假设的更好的解决方案(我无法生产,但真的很想看到)有任何区别。

SQL> with test (id, username, send_date, message) as
  2    (select 1, 'user A', to_date('12.02.2018 10:08', 'dd.mm.yyyy hh24:mi'), 'problem 1' from dual union
  3     select 2, 'user B', to_date('12.02.2018 11:34', 'dd.mm.yyyy hh24:mi'), 'what?'     from dual union
  4     select 3, 'user B', to_date('12.02.2018 14:12', 'dd.mm.yyyy hh24:mi'), 'try this'  from dual union
  5     select 4, 'user A', to_date('13.02.2018 09:29', 'dd.mm.yyyy hh24:mi'), 'see here'  from dual union
  6     select 5, 'user B', to_date('13.02.2018 13:34', 'dd.mm.yyyy hh24:mi'), 'do this'   from dual
  7    )
  8  select
  9    t.id,
 10    t.username,
 11    t.send_date,
 12    t.message,
 13    --
 14    (select t2.message
 15     from test t2
 16     where t2.username <> t.username
 17       and t2.id = (select max(t3.id)
 18                    from test t3
 19                    where t3.username <> t.username
 20                      and t3.id < t.id
 21                   )
 22    ) reply_to
 23  from test t
 24  order by t.id;

        ID USERNA SEND_DATE        MESSAGE   REPLY_TO
---------- ------ ---------------- --------- ---------
         1 user A 12.02.2018 10:08 problem 1
         2 user B 12.02.2018 11:34 what?     problem 1
         3 user B 12.02.2018 14:12 try this  problem 1
         4 user A 13.02.2018 09:29 see here  try this
         5 user B 13.02.2018 13:34 do this   see here

SQL>