[英]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
)
基於用戶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.