寻找同一交易者在 3 分钟内买卖相同产品

时间:2021-04-05 10:58:28

标签: sql sql-server tsql

下面是示例表

    Create Table #A 
(
    Time nvarchar(70),
    Trader nvarchar(30),
    Product nvarchar(30),
    [Buy/Sell] nvarchar(30)
)

Insert into #A Values

('2019-03-01T14:22:29z', 'Jhon', 'Apple', 'Buy'),
('2019-03-01T12:35:09z', 'Jhon', 'Orange', 'Sell'),
('2019-03-01T12:35:09z', 'Mary', 'Milk', 'Buy'),
('2019-03-01T12:35:10z', 'Susan', 'Milk', 'Buy'),
('2019-03-01T12:35:23z', 'Tom', 'Bread', 'Sell'),
('2019-03-01T14:15:52z', 'Jhon', 'Apple', 'Sell'),
('2019-03-01T14:15:53z', 'Tom', 'Orange', 'Sell'),
('2019-03-01T14:22:33z', 'Mary', 'Apple', 'Buy'),
('2019-03-01T14:22:37z', 'Mary', 'Orange', 'Sell'),
('2019-03-01T12:37:41z', 'Susan', 'Milk', 'Buy'),
('2019-03-01T12:37:41z', 'Susan', 'Milk', 'Buy')

Select * from #A

基本上我要让同一个交易者在 3 分钟内买卖同一个产品

下面我已经尝试过这个,但不是正确的并且有效

;With DateTimeTbl
as
(
select SUBSTRING(a.Time,1,10) date, SUBSTRING(a.Time,12,8) Time1, a.*
-- lead(Time) over(order by time) cnt 
from #A a 
),
DataTbl
as
(
Select d.*, row_number() over(Partition by d.Trader,d.product order by d.time1) CntSrs  
from DateTimeTbl d 
--where [buy/sell] = 'Sell'
)
Select lag(Time1) over(order by time) cnt, d.*  from DataTbl d where CntSrs>1

1 个答案:

答案 0 :(得分:0)

<块引用>

基本上我要让同一个交易者在 3 分钟内买卖同一个产品

我建议lead()。获取第一条记录:

select a.*
from (select a.*,
             lead(time) over (partition by trader, product order by time) as next_time,
             lead(buy_sell) over (partition by trader, product order by time) as next_buy_sell
      from #a a
     ) a
where next_time < dateadd(minute, 3, time) and
      buy_sell <> next_buy_sell;

注意:这里假设 buy_sell 只有两个值,这与您的示例数据一致。

Here 是一个 db<>fiddle。请注意,它修复了适当的数据类型(对于 time 列)并重命名最后一列,因此不需要对其进行转义。