SQL подсчет вхождений условных операторов с использованием значений из 2 разных ролей - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть таблица с полями, включая время (UT C) и accountID.

accountID | time | ...
1         |12:00 |....
1         |12:01 |...
1         |13:00 |...
2         |14:00 |...

Мне нужно сделать запрос sql, чтобы вернуть accountID с новым полем, считая «category», где «category» может быть «a» или «b». Если есть запись строки из того же идентификатора учетной записи, которая имеет положительную разницу во времени, равную 1 минуте или меньше, категорию «a» необходимо увеличить, в противном случае - «b». Результаты из приведенной выше таблицы будут

accountID| cat a count| cat b count
1        | 1          | 2
2        | 0          | 1

Какие подходы я могу использовать для сравнения значений между различными строками и выходными вхождениями результатов сравнения?

Спасибо

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Чтобы вычислить эти категории, вам нужно предварительно вычислить результаты близких строк в «табличном выражении». Например:

select
  accountid,
  sum(case when cnt > 0 then 1 else 0 end) as cat_a_count,
  sum(case when cnt = 0 then 1 else 0 end) as cat_b_count
from (
  select
    accountid, tim,
    ( select count(*)
      from t b 
      where b.accountid = t.accountid 
        and b.tim <> t.tim 
        and b.tim between t.tim and addtime(t.tim, '00:01:00')
    ) as cnt
  from t
) x
group by accountid

Результат:

accountid  cat_a_count  cat_b_count
---------  -----------  -----------
1          1            2          
2          0            1          

Для справки я использовал скрипт данных:

create table t (
  accountid int,
  tim time
);

insert into t (accountid, tim) values 
  (1, '12:00'),
  (1, '12:01'),
  (1, '13:00'),
  (2, '14:00');
0 голосов
/ 10 февраля 2020

Использование lag() и условное агрегирование:

select accountid,
       sum(prev_time >= time - interval 1 minute) as a_count, 
       sum(prev_time < time - interval 1 minute or prev_time is null) as b_count
from (select t.*,
             lag(time) over (partition by accountid order by time) as prev_time
      from t
     ) t
group by accountid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...