SQL-запрос, основанный на порядке событий - PullRequest
0 голосов
/ 04 марта 2019

У меня есть таблица, которая выглядит примерно так (имя, действие, время)

c1 sell 10
c1 buy  5
c1 sell 4
c1 buy  3 
c1 buy  2
c2 sell 1
c2 buy  2 
c3 buy  3
c3 sell 20
c3 sell 15
c3 buy  10
c3 buy  1

Я хотел бы написать sql, который выводит клиентов , последнее действие которых было продать так что в этом случае мой запрос должен вернуть c1, c3.

Я довольно новичок в SQL, поэтому не знаю, как бы я структурировал такой запрос.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вы можете использовать подзапрос с группировкой, связанной с основным оператором in:

select *
  from t
 where action = 'sell'
   and (name, time) in
       (
        select name, max(time)
          from t
         group by name );
0 голосов
/ 04 марта 2019

Таблицы SQL представляют неупорядоченные наборы.Таким образом, «последнее» действие отсутствует, если только в столбце не указан порядок.Позвольте мне предположить, что столбец time содержит эту информацию.

Тогда:

select t.*
from t
where t.time = (select max(t2.time)
                from t t2
                where t2.name = t.name
               ) and
      t.action = 'sell';

Вы можете также подойти к этому с агрегацией, если вы просто хотите, чтобы клиенты:

select name
from t
group by name
having max(time) = max(case when action = 'sell' then time end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...