Oracle10g 在条件下获取oracle中的前一行
如果我有一个具有以下表结构id、用户名、发送日期、消息的表,那么如何通过Oracle SQL获取不同用户的上一条消息 假设我有以下数据Oracle10g 在条件下获取oracle中的前一行,oracle10g,Oracle10g,如果我有一个具有以下表结构id、用户名、发送日期、消息的表,那么如何通过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
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'
基本上,我需要在写响应时显示我正在回复的消息,这应该是我以外的人写的前一条消息;但是,由于它多次访问源表,因此似乎不是很有效。尽管如此,如果没有那么多行,您可能不会看到与假设的更好的解决方案有任何区别,我无法给出,但非常希望看到
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>