2016-04-09 17 views
-1

desteklenmediğinde aynı sonuçları elde etmek nasıl 2 tablolar var. 3 sütun içerir. uuid, user_id, emerg_atkorelasyon alt sorgu

alımları: Bu tablo bir kullanıcı tarafından yapılmış tüm alışverişleri içermektedir. purchase_id, user_id, purchased_at

soru: Bu 3 sütun içeren her oturum için numara kullanıcı zaten oturumun anda yapmıştı satın bulmak

sahte kod:

for session in sessions: 
    current_session_user_id = session["user_id"] 
    current_session_timestamp = session["occurred_at"] 
    num_purchases_made_at_the_time = query(
     SELECT count(*) FROM purchases 
     WHERE 
      purchases.user_id = current_session_user_id 
      AND purchases.purchased_at < current_session_timestamp 
    ) 

Not: Sigara eşitlik korelasyon alt sorgu ifadesi benim veritabanında desteklenmiyor (Vertica)

Bazı fikirleri Ben ilişkili alt sorgu kullanmak mümkün değildi çünkü:

  1. Her bir kullanıcı için her bir sipariş sayımı gerçekleştiğinde indeksleyen ve sonra birleştiren bir CTE yazın.()

cevap

0

Bunu mu demek istediniz: CTE as Ortak Tablo Expression veya ... CTE as Conditional True Event? :-)

Eğer varsa:

SQL> select * from sessions order by uuid; 
uuid | user_id |  occurred_at  
------+---------+--------------------- 
    1 |  100 | 1959-03-07 04:31:15 
    2 |  100 | 1969-03-07 05:31:15 
    3 |  200 | 1979-03-07 06:31:15 
    4 |  200 | 1989-03-07 07:31:15 
    5 |  300 | 1999-03-07 08:31:15 

ve: Sonra

SQL> select * from purchases order by purchase_id; 
purchase_id | user_id | purchased_at  
-------------+---------+--------------------- 
     1000 |  100 | 1959-03-07 04:32:15 
     1001 |  100 | 1959-03-07 04:33:15 
     1002 |  100 | 1969-03-07 05:32:15 
     1003 |  200 | 1979-03-07 06:32:15 
     1004 |  300 | 1999-03-07 08:32:15 

:

SQL> select max(a.user_id) as user_id, a.occurred_at, max(a.cte) as num_purchases 
    from (select s.user_id, s.occurred_at, 
        conditional_true_event(purchased_at < occurred_at) 
        over(partition by s.user_id order by s.occurred_at) as cte 
      from purchases p inner join sessions s 
       on p.user_id = s.user_id 
    ) a 
    group by a.occurred_at 
    order by 1, 2; 
user_id |  occurred_at  | num_purchases 
---------+---------------------+--------------- 
    100 | 1959-03-07 04:31:15 |    0 
    100 | 1969-03-07 05:31:15 |    2 
    200 | 1979-03-07 06:31:15 |    0 
    200 | 1989-03-07 07:31:15 |    1 
    300 | 1999-03-07 08:31:15 |    0