получить предыдущую строку в оракуле при условии - PullRequest
0 голосов
/ 27 апреля 2018

если у меня есть таблица со следующей структурой таблицы (id, имя пользователя, 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 голосов
/ 28 апреля 2018

Вот одна опция, которая возвращает желаемый результат; хотя, кажется, не очень эффективен, так как он обращается к исходной таблице несколько раз. Хотя, если там не так много строк, вы, вероятно, не увидите никаких отличий от гипотетически лучшего решения (которое я не смог представить, но очень хотел бы увидеть).

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...