Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在microsoft sql server上在有限的时间范围内从同一个人处获取两个事务?_Sql_Sql Server - Fatal编程技术网

如何在microsoft sql server上在有限的时间范围内从同一个人处获取两个事务?

如何在microsoft sql server上在有限的时间范围内从同一个人处获取两个事务?,sql,sql-server,Sql,Sql Server,我希望在Microsoft SQL Server上获取在两分钟内发生在同一用户身上的任何事务 我以自己为基础,试图解决我的问题,最后提出了以下问题: SELECT css.* FROM ( SELECT css.*, ( SELECT COUNT(*) FROM CashlessTransactions t2 WHERE t2.IdCustomerSmartcard = css.IdCustomerSmartcard AND t2.IdCash

我希望在Microsoft SQL Server上获取在两分钟内发生在同一用户身上的任何事务

我以自己为基础,试图解决我的问题,最后提出了以下问题:

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;
编辑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查询对每笔交易所做的是在原始交易的2分钟内,获取使用同一张卡进行的不同交易的计数。它为主查询中的每个事务获取此计数。然后,它返回每个事务,其中至少有一个其他事务在第一个事务的2分钟内发生。因此,对于您的三个示例记录,第一个tran tran1返回时计数为2,因为下两个tran在2分钟内。下一个tran tran2返回时计数为1,因为列表中只有最后一个事务在tran2的2分钟内。最后一个事务没有返回,因为计数为0,后面没有事务,因此由WHERE过滤掉

2如果您只关心IdEvent为2的事务,则需要加入POSDevices、EventSessionSetup和events两次

这是我想到的。您可以更改主选择返回的列,我建议您更改左侧联接子查询中的css.*以仅返回主选择中所需的列


你能发布一些样本数据吗?如果有两个事务匹配,并且只返回一个,那么这种情况就是一个很好的示例。另外,您可以提供Cashlestransactions表的DDL吗?如果事务1发生在时间X,事务2发生在时间X+90秒,事务3发生在时间X+180秒,您希望所有三个事务都返回吗,或者只是其中两个的组合?@digital.亚伦,我已经添加了数据样本,但我不确定是什么DDL@digital.aaron我想要其中的3个,或者4个,中间的一个重复,在两个集合上分开。这确实更接近我想要的,但是我现在在这3个事务上得到了重复的值。第一个值将出现两次。我会试着把它弄得一团糟,看看我是否能修复它。它出现了两次,因为在2分钟内发生了另外两个事务。查询会为每个事务对返回一条记录。因此,如果我让tran1:date=now,tran2:date=now+1分钟,并对其进行查询,我会通过设计得到tran1,tran1,tran2?实际上,这只是标签上的一些问题。”“OriginalTransaction”带有重复值,即使它们是不同的交易。当我找到正确的方法来纠正它时,我将编辑您的答案我猜使用您提供的示例数据,id=4DA8FA70-905F-44B3-8513-26F4A9AFD212的事务将在OriginalTransaction下出现两次。但这两条记录都有一个不同的TranWithin2Min id。您从未说过您希望如何格式化数据,而且您似乎不喜欢有一条记录包含2分钟内发生的事务数,因此我必须自己想出一种在这个问题背景下仍然有意义的格式。您可以根据自己的需要随意修改此代码。
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
SELECT 
    UsersCardID             = c1.IdCustomerSmartcard 
    ,OriginalTransaction    = c1.IdCashlessTransaction
    ,OrigTranDate           = c1.Date
    ,OrigTranAmount         = c1.Amount
    ,TranWithin2Min         = c2.IdCashlessTransaction
    ,TranWithin2MinDate     = c2.Date
    ,TranWithin2MinAmount   = c2.Amount
FROM #CashlessTransactions      c1
JOIN [dbo].[POSDevices]         pd1 ON pd1.IdPOSDevice = c1.IdPOSDevice
JOIN [dbo].[EventSessionSetups] ess1 ON ess1.IdEventSessionSetup = pd1.IdEventSessionSetup
JOIN [dbo].[events]             e1 ON e1.IdEvent = ess1.IdEvent
LEFT JOIN (
            SELECT 
                css.*
            FROM CashlessTransactions css
            JOIN [dbo].[POSDevices]         pd2 ON pd2.IdPOSDevice = css.IdPOSDevice
            JOIN [dbo].[EventSessionSetups] ess2 ON ess2.IdEventSessionSetup = pd2.IdEventSessionSetup
            JOIN [dbo].[events]             e2 ON e2.IdEvent = ess2.IdEvent
            WHERE e.IdEvent = 2
) c2 ON c2.IdCustomerSmartcard = c1.IdCustomerSmartcard AND c2.IdCashlessTransaction <> c1.IdCashlessTransaction
WHERE c2.Date >= c1.Date 
    AND c2.Date < DATEADD(MINUTE, 2, c1.Date)
    AND c2.IdCashlessTransaction IS NOT NULL
ORDER BY c1.date, c2.date