3

私はこのケースを持っています: ユーザーは Web サイトで検索を行っており、一部のユーザーは購入しています。購入条件が true で、検索セッション = 購入セッションで、次の購入なしで検索行った 18 歳以上のユーザーをどのように選択しますか?

これにより、検索イベントがあり、年齢が 18 歳以上のユーザーが選択されます。

select DISTINCT ON (id) id, email, users.age, events.type, events.createdon 
from users 
   LEFT JOIN events ON events.user = users.users 
where events.type='search' 
  and age>18 
  and events.condition is true

同じセッションで以前に検索イベントを行ったという条件を追加するにはどうすればよいですか?

イベントのテーブル構造:

-----------------------------------------------------
| user |   event   |    date    | condition | session |
------------------------------------------------------|
|  1   |  search   | 08-10-2013 |   true    |    A    |
|  1   |  search   | 08-10-2013 |   true    |    A    |
|  2   |  search   | 08-10-2013 |   false   |    B    |
|  2   | purchase  | 09-10-2013 |   false   |    A    |
|  2   |  search   | 09-10-2013 |   true    |    C    |
|  1   | purchase  | 09-10-2013 |   true    |    A    |
|  3   |  search   | 09-10-2013 |   false   |    D    |
|  2   |  search   | 10-10-2013 |   true    |    H    |
|  4   |  search   | 10-10-2013 |   false   |    E    |
|  4   |  search   | 10-10-2013 |   false   |    E    |
|  3   |  search   | 11-10-2013 |   true    |    D    |
|  2   |  other    | 11-10-2013 |   true    |    H    |
|  1   |  search   | 11-10-2013 |   true    |    F    |
|  1   | purchase  | 12-10-2013 |   true    |    F    |
|  3   | purchase  | 12-10-2013 |   false   |    D    |
|  4   |  search   | 12-10-2013 |   true    |    G    |    
|  2   |  other    | 12-10-2013 |   true    |    A    |   
-----------------------------------------------------

ユーザーテーブルは次のとおりです。

------------------------
| user | email  | age  |
------------------------
|  1   |   a    |  22  |
|  2   |   b    |  34  |
|  3   |   c    |  15  |
|  4   |   d    |  44  |
|  5   |   e    |  39  |
------------------------

結果は 2 と 4 になります。

1    a   -> NO because did purchase with condition=true
2    b   -> YES because did search, did purchase BUT condition=false
3    c   -> NO because did search, did purchase with condition=false BUT age<18
4    d   -> YES because did search and no purchase 

ありがとう、私は Mongo の Postgres を使い始めたばかりで、はるかに優れています!

更新: たとえば、修正された結果

4

2 に答える 2

2

usersテーブルからのデータだけが必要な場合:

select
    u.*
from users as u
where
    u.age > 18 and
    exists (
        select *
        from events as e1
        where 
            e1.user = u.user and e1.condition is true and
            e1.event = 'search' and
            not exists (
                select *
                from events as e2
                where
                    e2.user = u.user and e2.condition is true and
                    e2.event = 'purchase' and
                    e2.session = e1.session and e2.date > e1.date
            )
    )

if も次のように実行できます。

select
    u.*
from users as u
where
    u.age > 18 and
    exists (
        select *           
        from (
            select
                max(case when e.event = 'search' then e.date end) as search_m_date,
                max(case when e.event = 'purchase' then e.date end) as purchase_m_date
            from events as e
            where e.user = u.user and e.condition is true
            group by e.session
        ) as a
        where
            a.search_m_date is not null and
            (a.purchase_m_date is null or a.search_m_date > a.purchase_m_date)
    )

しかし、実際には最初の方が好きです

sql fiddle demo

于 2013-09-17T09:08:22.697 に答える