1

我有一个交易、人员、交易日期、物品等的数据库。每次有人购买物品时,交易都会存储在表中,如下所示:

personNumber, TransactionNumber, TransactionDate, ItemNumber

我想要做的是找到从 2012 年 1 月 1 日(transactionDate)到 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 天的限制。我可以做一个日期差异,但是在哪里,在什么范围内?

4

2 回答 2

2

唉,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)可能会帮助它运行得更快。

于 2013-02-27T22:44:07.653 回答
1

如果您的问题表明您只想找到具有指定条件的人(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
于 2013-02-27T22:48:41.377 回答