2011-12-13 5 views
0

を見つける方法:私はMS SQLサーバーテーブルの万件のレコードを持っている最も一般的なパターン

異なる時点でのユーザーpuchase製品を意味
user1,product1,0 
user1,product2,time1 
user1,product3,time2 
user1,product4,time3 
user2,product3,0 
user2,product2,time4 
user3,product4,0 
user3,product5,time5 

。 3番目の列は購入時であり、値が0の場合は、最初に1つのアイテムしか購入しないと仮定して、このユーザーの最初の購入を意味します。

時間1、時間2、時間3など初回購入時と現在の購入時との時差だけです。 (製品には、次の購入品)として

トップ10の一般的な購入のペアとどのように多くの異なるユーザーがこのパターンに合う:

今私はとしてそれを要約する必要があります。

結果のペアは次のようになります。

(product1,product2) 
and (product1,product5) 
and (product2,product5) 
.... 

どのようにこれをSQLで実現できますか?多くのおかげで

+2

あなたは何を試してみましたか?リクエストごとにコードを実行する場合は、コンサルタントを雇う必要があります。スタックオーバーフローは、特定の問題の支援です。 – JNK

+0

これは宿題ですか?はいの場合は、 '宿題 'タグを追加してください。 – kol

+0

レコードは、コンポーネントを区切るコンマで1つの文字列に入っていますか、それともテーブルの3つの別々の列にありますか?最初は扱いにくいです(スキーマを修正してください)。 2番目は自明ではありませんが、少なくともデータをリレーショナル形式に並べ替えるのは混乱する必要はありません。 –

答えて

1

はこれを試してみてください:

declare @temp table (product1 varchar, product2 varchar, user_count int) 

insert into @temp (product1, product2, user_count 
select pr1.product, pr2.product, count(distinct userid) 
from 
purchases pr1 
inner join purchases pr2 on pr1.UserId = pr2.UserId and pr1.Time < pr2.Time 
group by 
pr1.product, 
pr2.product 


select top 10 * from @temp order by user_count desc 
+0

商品だけでなく、時間を比較する必要があります。 OPシーケンスごとに重要です。 – JNK

+0

ありがとうございます。修正されました。 – jmacinnes

+0

ありがとう、それは私のバージョンよりも優れています、これは実際にすべてのペアを得ることができます。私は左の結合としてそれを変更し、時間= 0を追加します、私はorignially最初と次の購入で購入を取得したいので、あなたの助けてくれてありがとう! – yzhang

関連する問題