Как условно подсчитать строки из другой таблицы БЕЗ ИСПОЛЬЗОВАНИЯ КОРРЕЛИРОВАННОГО ПОДЗАПРОСА?

У меня есть набор данных, для которого я должен условно подсчитать строки из таблицы B, которые находятся между двумя датами в таблице A. Я должен сделать это без использования коррелированного подзапроса в предложении SELECT, так как это не поддерживается в Netezza - документы: https://www.ibm.com/support/knowledgecenter/en/SSULQD_7.0.3/com.ibm.nz.dbu.doc/c_dbuser_correlated_subqueries_ntz_sql.html.

Справочная информация о таблицах: пользователи могут входить на сайт (входить в систему). Когда они входят в систему, они могут выполнять действия, которые находятся в (actions_taken). Желаемый результат - это количество строк, находящихся между actions_taken action_date и lag_action_date.

Здесь найдены данные и попытка: http://rextester.com/NLDH13254

Таблица: actions_taken (с добавленными вычислениями - см. RexTester.)

| user_id | action_type   | action_date | lag_action_date | elapsed_days |
|---------|---------------|-------------|-----------------|--------------|
| 12345   | action_type_1 | 6/27/2017   | 3/3/2017        | 116          |
| 12345   | action_type_1 | 3/3/2017    | 2/28/2017       | 3            |
| 12345   | action_type_1 | 2/28/2017   | NULL            | NULL         |
| 12345   | action_type_2 | 3/6/2017    | 3/3/2017        | 3            |
| 12345   | action_type_2 | 3/3/2017    | 3/25/2016       | 343          |
| 12345   | action_type_2 | 3/25/2016   | NULL            | NULL         |
| 12345   | action_type_4 | 3/6/2017    | 3/3/2017        | 3            |
| 12345   | action_type_4 | 3/3/2017    | NULL            | NULL         |
| 99887   | action_type_1 | 4/1/2017    | 2/11/2017       | 49           |
| 99887   | action_type_1 | 2/11/2017   | 1/28/2017       | 14           |
| 99887   | action_type_1 | 1/28/2017   | NULL            | NULL         |

Таблица: логины

| user_id | login_date |
|---------|------------|
| 12345   | 6/27/2017  |
| 12345   | 6/26/2017  |
| 12345   | 3/7/2017   |
| 12345   | 3/6/2017   |
| 12345   | 3/3/2017   |
| 12345   | 3/2/2017   |
| 12345   | 3/1/2017   |
| 12345   | 2/28/2017  |
| 12345   | 2/27/2017  |
| 12345   | 2/25/2017  |
| 12345   | 3/25/2016  |
| 12345   | 3/23/2016  |
| 12345   | 3/20/2016  |
| 99887   | 6/27/2017  |
| 99887   | 6/26/2017  |
| 99887   | 6/24/2017  |
| 99887   | 4/2/2017   |
| 99887   | 4/1/2017   |
| 99887   | 3/30/2017  |
| 99887   | 3/8/2017   |
| 99887   | 3/6/2017   |
| 99887   | 3/3/2017   |
| 99887   | 3/2/2017   |
| 99887   | 2/28/2017  |
| 99887   | 2/11/2017  |
| 99887   | 1/28/2017  |
| 99887   | 1/26/2017  |
| 99887   | 5/28/2016  |

ЖЕЛАТЕЛЬНЫЙ ВЫХОД: поле cnt_logins_between_action_dates

| user_id | action_type   | action_date | lag_action_date | elapsed_days | cnt_logins_between_action_dates |
|---------|---------------|-------------|-----------------|--------------|---------------------------------|
| 12345   | action_type_1 | 6/27/2017   | 3/3/2017        | 116          | 5                               |
| 12345   | action_type_1 | 3/3/2017    | 2/28/2017       | 3            | 4                               |
| 12345   | action_type_1 | 2/28/2017   | NULL            | NULL         | 1                               |
| 12345   | action_type_2 | 3/6/2017    | 3/3/2017        | 3            | 2                               |
| 12345   | action_type_2 | 3/3/2017    | 3/25/2016       | 343          | 7                               |
| 12345   | action_type_2 | 3/25/2016   | NULL            | NULL         | 1                               |
| 12345   | action_type_4 | 3/6/2017    | 3/3/2017        | 3            | 2                               |
| 12345   | action_type_4 | 3/3/2017    | NULL            | NULL         | 1                               |
| 99887   | action_type_1 | 4/1/2017    | 2/11/2017       | 49           | 8                               |
| 99887   | action_type_1 | 2/11/2017   | 1/28/2017       | 14           | 2                               |
| 99887   | action_type_1 | 1/28/2017   | NULL            | NULL         | 1                               |

person psrpsrpsr    schedule 29.06.2017    source источник
comment
Почему вы добавили тег postgresql, если используете Netezza?   -  person a_horse_with_no_name    schedule 29.06.2017
comment
Я понял, что PostgreSQL - это поддерживаемый язык, который интерпретирует Netezza. Я думал, что Netezza - это аппаратное устройство хранилища данных, с помощью которого интерпретируется поддерживаемый синтаксис SQL. Нет? Здесь очень ценится ясность, поскольку я простой аналитик данных. Удалить метку?   -  person psrpsrpsr    schedule 29.06.2017
comment
Нет, совсем нет. Это две очень разные системы баз данных. Оба используют SQL в качестве языка запросов - возможно, это то, о чем вы думали.   -  person a_horse_with_no_name    schedule 29.06.2017
comment
Спасибо за вклад, ребята. Есть мысли о том, как достичь желаемого результата? Спасибо   -  person psrpsrpsr    schedule 29.06.2017


Ответы (1)


Вам не нужен коррелированный подзапрос. Получите предыдущую дату, используя lag и join таблицу логинов для подсчета действий между датами.

with prev_dates as (select at.*
                    ,coalesce(lag(action_date) over(partition by user_id,action_type order by action_date)
                              ,action_date) as lag_action_date 
                    from actions_taken at
                   )
select at.user_id,at.action_type,at.action_date,at.lag_action_date
,at.action_date-at.lag_action_date as elapsed_days
,count(*) as cnt
from prev_dates at
join login l on l.user_id=at.user_id and l.login_date<=at.action_date and l.login_date>=at.lag_action_date
group by at.user_id,at.action_type,at.action_date,at.lag_action_date
order by 1,2,3
person Vamsi Prabhala    schedule 29.06.2017
comment
Блестяще! Таким образом, процесс следующий: 1.) создать CTE, который объединяет нулевые значения задержки с датой действия 2.) внутреннее соединение таблицы A с таблицей B, так что нужные строки теперь находятся в одной таблице 3.) count (*) и group . Очень признателен! - person psrpsrpsr; 29.06.2017