2013-02-27 51 views
1

我有交易,人員,交易日期,物品等數據庫。 每次有人購買物品時,交易存儲在表格中,如下所示:特定時間段內的多筆交易,受日期範圍限制

personNumber, TransactionNumber, TransactionDate, ItemNumber 

我想要做的是找到誰,從2012年(transactionDate)1月1日起至2012年3月1日已多次購買同一ItemNumber在14天內(配置)或更少的人(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天的限制。我可以做一個過時的,但是在哪裏,在哪?

回答

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)上的索引可能有助於提高運行速度。

+0

這裏感到困惑,交易的別名是「T」正如子選擇一樣。 – Derek 2013-02-27 22:58:10

+0

謝謝,似乎這樣做。我確實看到這裏出現的單身單身人士,但我可以手動刪除這些單身人士。 – Derek 2013-02-27 23:36:27

+0

這很好,似乎沒有得到最後一筆交易,如果它在14天內,它確實會得到第一筆交易。 – Derek 2013-03-05 00:07:03

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 
+0

這是一個報告,我討厭爲報告創建臨時表。這絕對是我會記住的解決方案。 – Derek 2013-02-27 23:40:09

+0

@Derek臨時表僅用於我的測試。只需將#tx替換爲事務即可。 – Phil 2013-02-28 07:30:32

相關問題