SQL - найти идентификатор для всех идентификаторов, которые удовлетворяют условию - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь выполнить SQL-запрос к этой базе данных ниже:

Пытаюсь найти ошибки в моей системе, которая отслеживает следующих людей, которые входят и выходят из моего портала.Технически вы должны сначала выйти, затем вы можете получить еще одну запись.Поэтому я пытаюсь найти пользователей, у которых время выхода до следующей записи.Мы игнорируем возврат, в результате чего время выхода будет Ноль или пусто .

Чтобы найти r_id (квитанция_идентификатора) для каждого пользователя, для которого текущий date_time_out (при выходе) находится перед date_time_in его следующего чека (при повторном входе).Мне нужно вернуть все их уникальные идентификаторы квитанции для этих пользователей, так как это ошибки.

пример дБ:

r_id | user_id |  date_time_in | date_time_out   | date_time_refund

0001 | 12345   | 21/02/19 01:00| 23/02/19 01:12

0002 | 12345   | 21/02/19 01:10| 23/02/19 01:15

0003 | 12345   | 21/02/19 01:16| 23/02/19 01:17

0009 | 12346   | 21/02/19 01:02| _____Null______ | 23/02/19 01:03

0010 | 12346   | 21/02/19 01:02| 23/02/19 01:03

ожидаемый результат (по возрастанию):

0001

0002

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Предполагая, что r_id захватывает последовательность записей, используйте exists:

select e.*
from example e
where exists (select 1
              from example e2
              where e2.user_id = e.user_id and
                    e2.r_id > e.r_id and
                    e2.date_time_in < e.date_time_out
             ) or
      exists (select 1
              from example e2
              where e2.user_id = e.user_id and
                    e2.r_id < e.r_id and
                    e2.date_time_in > e.date_time_out
             );
0 голосов
/ 27 августа 2018

вы можете использовать самостоятельное соединение

select a.r_id , b.r_id
from my_table a 
inner join my_table b on a.user_id = b.user_id 
        and a.date_time_out > b.date_time_in 
        and a.date_time_out is nul null 
order by a.r_id asc 

или для отдельного ряда

  select * from my_table  m 
  inner join  
  (
      select a.r_id id1 , b.r_id id2
      from my_table a 
      inner join my_table b on a.user_id = b.user_id 
              and a.date_time_out > b.date_time_in 
              and a.date_time_out is nul null 
  ) t on m.r_id = t.id1 or m.r_id = id2 
  order by m.r_id asc 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...