2017-05-26 74 views
-1

我有用戶的網站交互的一個表:加入最接近的現有時間戳

::: site_interactions ::: 
+-------+---------------------+ 
| user | timestamp   | 
+-------+---------------------+ 
| john | 2017-01-01 15:00:00 | 
+-------+---------------------+ 
| john | 2017-01-01 15:30:00 | 
+-------+---------------------+ 
| sarah | 2017-01-03 12:00:00 | 
+-------+---------------------+ 

和店內交易的輔助表:

::: store_transactions ::: 
+-------+---------------------+ 
| user | timestamp   | 
+-------+---------------------+ 
| john | 2017-01-02 08:00:00 | 
+-------+---------------------+ 
| sarah | 2017-01-02 09:00:00 | 
+-------+---------------------+ 
| tim | 2017-01-02 10:00:00 | 
+-------+---------------------+ 

我想加入的網站互動到在店內的東西,但只返回:

a)最近的互動時間戳,而且

B)的相互作用時間戳必須是交易時間戳

所以在這個例子之前,我想最終:

+-------+---------------------+------------------------+ 
| user | timestamp   | last_prior_interaction | 
+-------+---------------------+------------------------+ 
| john | 2017-01-02 08:00:00 | 2017-01-01 15:30:00 | 
+-------+---------------------+------------------------+ 
| sarah | 2017-01-02 09:00:00 | NULL     | 
+-------+---------------------+------------------------+ 
| tim | 2017-01-02 10:00:00 | NULL     | 
+-------+---------------------+------------------------+ 

我懷疑答案是使用具有和MIN,但我只是當我還需要強制執行那個在先的交互謂詞時,我無法將自己的頭圍繞在它的工作方式上。有小費嗎?

+1

我刪除了不兼容的數據庫標籤。請僅使用您正在使用的數據庫進行標記。 –

+0

謝謝戈登 - 我有MySQL和BigQuery中的數據,但我想我會堅持MySQL :) –

+0

你的問題有什麼好運? – Jake

回答

1

如果你即使新的相互作用後發生,這裏的交易之前需要最新的時間戳是一個工作代碼:

SELECT T.user, I.timestamp 
FROM store_transactions T 
LEFT OUTER JOIN (
    SELECT I.user, MAX(I.timestamp) AS timestamp 
    FROM site_interactions I 
    INNER JOIN store_transactions T ON I.user = T.user 
    WHERE I.timestamp < T.timestamp 
    GROUP BY I.user 
) I ON I.user = T.user 
+0

This Works!感謝Gregory。未來用戶的工作演示:http://rextester.com/KDCE6826 –

1

http://rextester.com/WILC99478

SELECT 
    st.username 
, st.timestamp 
, CASE WHEN si.timestamp < st.timestamp THEN si.timestamp ELSE NULL END 'last_prior_interaction' 
FROM store_transactions st 
LEFT JOIN (SELECT username 
       , MAX(timestamp) timestamp 
      FROM site_interactions      
     GROUP BY username) si 
       ON si.username = st.username 

rextester不喜歡字段名 「用戶」,所以我用 「用戶名」 取而代之。

完全披露:我覺得可以在JOIN本身中處理「si.timestamp < st.timestamp」部分,但這會拉出您正在查找的數據。

+0

謝謝傑克 - 這很接近,但如果用戶在脫機事務之前和之後都有站點交互,它將返回null。參見例如; http://rextester.com/EZC19671 –

0

下面應該工作

Select st.user, st.timestamp, ut.timestamp from 
    Store_transaction st left join site_transaction ut 
    on ut.user=st.user and ut.timestamp > st.timestamp; 
+0

我看到這隻會返回先前的時間戳,但這是如何確保它是最新的? –