在一定时间周期内的多个事务,按日期范围限制(multiple transactions within

2019-10-17 18:36发布

我有交易的人,交易日期,物品等,每一次一个人买的物品的数据库,该交易被存储在表所示:

personNumber, TransactionNumber, TransactionDate, ItemNumber

我想要做的是找到谁,从2012年(transactionDate)1月1日起至2012年3月1日已在14天内(配置)或更少的购买同一ItemNumber多次人(personNumber)。 然后我需要列出一个报告,所有这些交易。

样本数据:

personNumber, TransactionNumber, TransactionDate, ItemNumber
1           |               100|      2001-01-31|        200
2           |               101|      2001-02-01|        206
2           |               102|      2001-02-11|        300
1           |               103|      2001-02-09|        200
3           |               104|      2001-01-01|        001
1           |               105|      2001-02-10|        200
3           |               106|      2001-01-03|        001
1           |               107|      2001-02-28|        200

结果:

personNumber, TransactionNumber, TransactionDate, ItemNumber
1           |               100|      2001-01-31|        200
1           |               103|      2001-02-09|        200
1           |               105|      2001-02-10|        200
3           |               104|      2001-01-01|        001
3           |               106|      2001-01-03|        001

你会如何去这样做?

我试着做它像这样:

select * 
from (
    select personNumber, transactionNumber, transactionDate, itemNumber,
count(*) over (
    partition by personNumber, itemNumber) as boughtSame)
from transactions
where transactionDate between '2001-01-01' and '2001-03-01')t
where boughtSame > 1

它让我这样的:

personNumber, TransactionNumber, TransactionDate, ItemNumber
1           |               100|      2001-01-31|        200
1           |               103|      2001-02-09|        200
1           |               105|      2001-02-10|        200
1           |               107|      2001-02-28|        200
3           |               104|      2001-01-01|        001
3           |               106|      2001-01-03|        001

问题是,我不希望TransactionNumber 107做什么,因为这14天内的不是。 我不知道在哪里把在14天内该限制。 我可以做一个DATEDIFF,但在那里,和在什么?

Answer 1:

可惜的是,在SQL Server 2005中的窗口功能只是不太足够强大。 我会使用相关子查询解决这个问题。

相关子查询计算的,一个人每次购买之后购买的14天之内的项目(并不算首次购买)的次数。

select t.*
from (select t.*,
             (select count(*)
              from t t2
              where t2.personnumber = t.personnumber and
                    t2.itemnumber = t.itemnumber and
                    t2.transactionnumber <> t.transactionnumber and
                    t2.transactiondate >= t.transactiondate and 
                    t2.transactiondate < DATEADD(day, 14, t.transactiondate
             ) NumWithin14Days
      from transactions t
      where transactionDate between '2001-01-01' and '2001-03-01'
     ) t
where NumWithin14Days > 0

您可能希望把时间限制在子查询也是如此。

在索引transactions(personnumber, itemnumber, transactionnumber, itemdate)可能有助于此运行得更快。



Answer 2:

如果你的问题指出,你只是想找到的人(personNumbers)使用指定的标准,你可以做一个自我的加入和组:

create table #tx (personNumber int, transactionNumber int, transactionDate dateTime, itemNumber int)
insert into #tx
values
    (1, 100, '2001-01-31', 200),
    (2, 101, '2001-02-01', 206),
    (2, 102, '2001-02-11', 300),
    (1, 103, '2001-02-09', 200),
    (3, 104, '2001-01-01', 001),
    (1, 105, '2001-02-10', 200),
    (3, 106, '2001-01-03', 001),
    (1, 107, '2001-02-28', 200)

declare @days int = 14

select t1.personNumber from #tx t1 inner join #tx t2 on 
    t1.personNumber = t2.personNumber 
    and t1.itemNumber = t2.itemNumber
    and t1.transactionNumber < t2.transactionNumber
    and datediff(day, t1.transactionDate, t2.transactionDate) between 0 and @days
group by t1.personNumber
-- if more than zero joined rows there is more than one transaction in period
having count(t1.personNumber) > 0 

drop table #tx


文章来源: multiple transactions within a certain time period, limited by date range