簡體   English   中英

在30分鍾內選擇交易類型適合特定訂單的UserID並對其進行分組

[英]Select & Group on UserID where Transaction Type fits a specific order and within 30 minutes

在我們的SQL Server 2008 R2數據庫中有一個表,用於存儲TransactionID,TimeStamp,TransactionType,UserID和其他信息。

CREATE TABLE [dbo].[TransactionRecords]( [TransactionID] [float] NULL, [TimeStamp] [datetime] NULL, [TransactionType] [nvarchar](255) NULL, [UserID] [nvarchar](255) NULL )

INSERT INTO TransactionRecords ( TransactionID, TimeStamp, TransactionType, UserID) VALUES
(3211, '2014-09-01 14:08:54.000', 'OnlineTrial', '00E235420CE9FD33'), 
(3212, '2014-09-01 14:28:19.000', 'OnlineOrder', '00E235420CE9FD33'), 
(3213, '2014-09-01 14:29:00.000', 'NewsletterSubscribe', '31E4E29230BFA615'), 
(3214, '2014-09-01 14:34:50.000', 'OnlineTrial', '2D37174DD60F450B'), 
(3215, '2014-09-01 14:44:44.000', 'OnlineOrder', '2D580670019B61F6'), 
(3216, '2014-09-01 14:54:22.000', 'NewsletterSubscribe', '376C5DF69356616E'), 
(3217, '2014-09-01 15:03:06.000', 'OnlineTrial', '31E4E29230BFA615'), 
(3218, '2014-09-01 15:27:01.000', 'OnlineOrder', '31E4E29230BFA615'), 
(3219, '2014-09-01 15:33:00.000', 'NewsletterSubscribe', '130F764A98409EF4'), 
(3220, '2014-09-01 15:42:00.000', 'OnlineTrial', '0417546E0D518432'), 
(3221, '2014-09-01 16:18:50.000', 'OnlineOrder', '05E4EB4E47C756B6'), 
(3222, '2014-09-01 16:55:40.000', 'OnlineOrder', '1B9FEBB7FD029625'), 
(3223, '2014-09-01 17:32:30.000', 'OnlineOrder', '061310EE4F20E3EA'), 
(3224, '2014-09-01 18:01:20.000', 'OnlineTrial', '061310EE4F20E3EA'), 
(3225, '2014-09-01 18:46:10.000', 'NewsletterSubscribe', '144937298097C9D4')`

我想做的是查詢,以便在時間戳記的30分鍾內返回用戶的交易ID,並以OnlineTrial和OnlineOrder的身份記錄他們。

現在我的查詢是:

SELECT DISTINCT a.[TransactionID]
  ,a.[TimeStamp]
  ,a.[TransactionType]
  ,a.[UserID]
FROM [Adhoc].[dbo].[TransactionRecords] a
LEFT OUTER JOIN [Adhoc].[dbo].[TransactionRecords] b
ON a.UserID = b.UserID
WHERE DATEDIFF(MI, a.timestamp, b.timestamp) <= 30
AND a.TransactionID <> b.TransactionID
AND (a.TransactionType = 'OnlineTrial'
OR a.TransactionType = 'OnlineOrder')
ORDER BY a.UserID, a.TimeStamp

理想的查詢僅返回事務3211、3212、3217和3218,但是我的查詢仍然返回結果,其中用戶接受了OnlineOrder,然后進行了OnlineTrial(ID 3223和3224)

您可以使用exists來匹配必要的行:

select
    *
from
    dbo.TransactionRecords t1
where
    t1.transactiontype = 'OnlineTrial' and
    exists (
        select
            'x'
        from
            dbo.TransactionRecords t2
        where
            t1.UserID = t2.UserID and
            t2.transactiontype = 'OnlineOrder' and
            datediff(mi, t1.Timestamp, t2.Timestamp) between 0 and 30
    )
union all
select
    *
from
    dbo.TransactionRecords t1
where
    t1.transactiontype = 'OnlineOrder' and
    exists (
        select
            'x'
        from
            dbo.TransactionRecords t2
        where
            t1.UserID = t2.UserID and
            t2.transactiontype = 'OnlineTrial' and
            datediff(mi, t2.Timestamp, t1.Timestamp) between 0 and 30
    )

示例SQLFiddle

基於用戶ID和顯式事務類型引用,應該是對自身的簡單JOIN。 外部WHERE僅獲得在線試用... JOIN明確地尋找同一用戶,但是在線ORDER ..通過ANDing時差應該是您所需要的。

select
      tr.transactionid,
      tr.timestamp,
      tr.transactionType,
      tr.UserID
   from
      transactionRecords tr
         JOIN transactionRecords trOrder
            on tr.UserID = trOrder.UserID
           AND trOrder = 'OnlineOrder'
           AND DATEDIFF(MI, tr.timestamp, trOrder.timestamp) <= 30
   where
      tr.transactionType = 'OnlineTrial'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM