如何在microsoft sql server上的有限时间范围内从同一个人那里获得2笔交易?

时间:2017-12-29 18:09:08

标签: sql sql-server

我希望在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

1 个答案:

答案 0 :(得分:1)

1)查询对每笔交易所做的是在原始交易的2分钟内获得使用同一张卡进行的不同交易的计数。它为主查询中的每个事务获取此计数。然后它返回每个事务,该事务至少有一个事件发生在第一个事件的2分钟内。因此,对于您的三个样本记录,第一个tran(tran1)返回计数为2(因为接下来的两个trans在2分钟内)。下一个tran(tran2)返回计数为1,因为只有列表中的最后一个事务在tran2的2分钟内。不返回最后一个事务,因为计数为0(后面没有变换),因此被WHERE过滤掉。

2)如果您只关心IdEvent为2的交易,则您需要加入POSDevicesEventSessionSetupsevents两次。

这是我想出的。您可以更改主SELECT返回的列,我建议您更改css.*子查询中的LEFT JOIN,只返回主{{1}中所需的列}}

SELECT