Получите различные значения в объединении всех в улье

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

cust_id  prod_id timestamp
1        11      2011-01-01 03:30:23
2        22      2011-01-01 03:34:53
1        22      2011-01-01 04:21:03
2        33      2011-01-01 04:44:09
3        33      2011-01-01 04:54:49

так далее и так далее.

Для каждой записи я хочу проверить, сколько уникальных продуктов этот клиент купил за последние 24 часа, исключая текущую транзакцию. Таким образом, вывод должен выглядеть примерно так:

1     0
2     0
1     1
2     1
3     0

Мой запрос улья выглядит примерно так

select * from(
select t1.cust_id, count(distinct t1.prod_id) as freq from temp_table t1
left outer join temp_table t2 on (t1.cust_id=t2.cust_id) 
where t1.timestamp>=t2.timestamp 
and unix_timestamp(t1.timestamp)-unix_timestamp(t2.timestamp) < 24*60*60
group by t1.cust_id
union all
select t.cust_id, 0 as freq from temp_table t2
)unioned;

person newbie    schedule 19.12.2014    source источник
comment
Что вы подразумеваете под исключением текущей транзакции? Вы имеете в виду последнюю транзакцию?   -  person Nonnib    schedule 19.12.2014


Ответы (2)


Просто получите все строки за последние 24 часа, сгруппируйте по custid и подсчитайте (различный productid) -1 в качестве вывода. Общий запрос будет выглядеть примерно так.

выберите cust_id, COUNT(различный prod_id) - 1 из table_name где unix_timestamp(t1.timestamp)-unix_timestamp(t2.timestamp) ‹ 24*60*60 GROUP BY cust_id

* Здесь я вычитаю 1, чтобы исключить последний идентификатор транзакции пользователя. (надеюсь, это то, что вы имели в виду)

person Amar    schedule 19.12.2014

Вы можете присоединиться к производной таблице, которая содержит определенное количество продуктов, приобретенных за последние 24 часа для каждой пары клиент/отметка времени.

select t1.cust_id, t1.prod_id, t1.timestamp, t2.count_distinct_prod_id - 1
from mytable t1
join (
    select t2.cust_id, t2.timestamp, count(distinct t3.prod_id) count_distinct_prod_id
    from mytable t2
    join mytable t3 on t3.cust_id = t2.cust_id
    where unix_timestamp(t2.timestamp) - unix_timestamp(t3.timestamp) < 24*60*60
    group by t2.cust_id, t2.timestamp
) t2 on t1.cust_id = t2.cust_id and t1.timestamp = t2.timestamp
person FuzzyTree    schedule 19.12.2014