我希望在Microsoft SQL Server
上在2分钟内让同一用户发生任何交易我基于this question尝试解决我的问题,最后得到了这个问题:
SELECT css.*
FROM
(
SELECT css.*,
(
SELECT COUNT(*)
FROM CashlessTransactions t2
WHERE t2.IdCustomerSmartcard = css.IdCustomerSmartcard
AND t2.IdCashlessTransaction <> css.IdCashlessTransaction
AND t2.Date >= css.Date
AND t2.Date < DATEADD(minute, 2, css.Date)
) tranwithin2min
FROM CashlessTransactions css
) css
JOIN [dbo].[POSDevices] pd ON pd.IdPOSDevice = css.IdPOSDevice
JOIN [dbo].[EventSessionSetups] ess ON ess.IdEventSessionSetup = pd.IdEventSessionSetup
JOIN [dbo].[Events] e ON e.IdEvent = ess.IdEvent
WHERE e.IdEvent = 2
AND tranwithin2min > 0
ORDER BY css.Date;
问题是: 1-我不完全理解这是如何工作的,所以结果不是我所期望的 - &gt;如果在此期间有2笔交易匹配,我只能获得其中的一笔。我试过搞乱,添加一些过滤器并删除其他过滤器,但无法获得我想要的结果
2-查询需要很长时间才能运行。我认为它在所有无现金交易中得到子查询,这是很多,然后再做IdEvent = 2,这会缩小搜索范围
编辑1:添加数据样本:
IdCashlessTransaction IdCustomerSmartcard Amount Date IdPOSDevice
4DA8FA70-905F-44B3-8513-26F4A9AFD212 364DBAA2-E85D-45C3-A4DC-7549A4E7ECE5 10.00 2017-02-23 18:18:50.000 D3E5452E-4DAB-4B4D-B64D-24599DDA7A49
0B486470-2CB6-4145-8BA5-5B54AABEF997 364DBAA2-E85D-45C3-A4DC-7549A4E7ECE5 0.00 2017-02-23 18:18:51.000 D3E5452E-4DAB-4B4D-B64D-24599DDA7A49
8B156710-29CF-4104-B669-63A004F1B19B 364DBAA2-E85D-45C3-A4DC-7549A4E7ECE5 -9.79 2017-02-23 18:19:06.000 D3E5452E-4DAB-4B4D-B64D-24599DDA7A49
编辑2:添加了请求的DDL:
CREATE TABLE [dbo].[CashlessTransactions](
[IdCashlessTransaction] [uniqueidentifier] NOT NULL,
[IdUser] [uniqueidentifier] NOT NULL,
[IdCustomerSmartcard] [uniqueidentifier] NOT NULL,
[IdPOSDevice] [uniqueidentifier] NULL,
[Amount] [decimal](10, 2) NOT NULL,
[Date] [datetime] NOT NULL,
CONSTRAINT [PK_POSTransactions] PRIMARY KEY CLUSTERED
(
[IdCashlessTransaction] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
答案 0 :(得分:1)
1)查询对每笔交易所做的是在原始交易的2分钟内获得使用同一张卡进行的不同交易的计数。它为主查询中的每个事务获取此计数。然后它返回每个事务,该事务至少有一个事件发生在第一个事件的2分钟内。因此,对于您的三个样本记录,第一个tran(tran1)返回计数为2(因为接下来的两个trans在2分钟内)。下一个tran(tran2)返回计数为1,因为只有列表中的最后一个事务在tran2的2分钟内。不返回最后一个事务,因为计数为0(后面没有变换),因此被WHERE
过滤掉。
2)如果您只关心IdEvent为2的交易,则您需要加入POSDevices
,EventSessionSetups
和events
两次。
这是我想出的。您可以更改主SELECT
返回的列,我建议您更改css.*
子查询中的LEFT JOIN
,只返回主{{1}中所需的列}}
SELECT