3

次の構造のテーブルがあります。

Table Name: CustomerStocks

Structure 
Name                     Varchar(25) 
StockSymbol              Varchar(4)

以下は、テーブル コンテンツのサンプルです。

名前 StockSymbol

Sam    AAPL
Sam    AMZN
Sam    GOOG

Judy   AAPL
Judy   AMZN

Jen    AMZN

Brian  GOOG
Brian  MSFT

目標には顧客名が付けられます。同様のポートフォリオを持つ他の顧客のリストを見つけるにはどうすればよいですか。つまり、元の顧客のすべての株式が存在する必要があります。

したがって、Jen のポートフォリオが類似している顧客を探している場合、結果は Judy と Sam になります。

ジュディと同様のポートフォリオを持つ顧客を検索すると、結果はサムになります。

ただし、Brian のポートフォリオを持つ顧客を検索している場合、行が返されないか、Brian だけが返される可能性があります。

これは可能ですか?もしそうなら、これを達成するためにどのようにSQLクエリを書くのですか?

これについては、どんな助けも本当に感謝しています。

4

5 に答える 5

0

さて、これはどうですか:

declare @Name Varchar(25) = 'Judy'
declare @table (StockSymbol varchar(4))

--Get StockSymbols to search for
insert into @table
select cs.StockSymbol 
from CustomerStocks cs 
where cs.Name = @Name
group by cs.StockSymbol


--Match against the people
select cs.Name from CustomerStocks cs
where (select count(*) 
     from CustomerStocks x 
     inner join @table t on x.StockSymbol = t.StockSymbol
     where x.Name = cs.Name
     group by x.StockSymbol) = (select count(*) from @table t)
group by cs.Name
于 2013-03-15T22:56:15.910 に答える
0

このようなものは、エンジンに依存せずに機能する可能性があります。

SELECT target.Name, 'similar_to', others.Name
FROM (
  SELECT Name, COUNT(*) numStocks
  FROM CustomerStocks
  GROUP BY Name
) target
  INNER JOIN (
    SELECT cs1.Name match, cs2.Name otherName, count(*) commonStocks
    FROM CustomerStocks cs1
      INNER JOIN CustomerStocks cs2
        ON cs1.StockSymbol = cs2.StockSymbol
          AND cs1.Name <> cs2.Name
    GROUP BY cs1.Name, cs2.Name
  ) others ON target.Name = others.match
      AND others.commonStocks >= numStocks.numStocks
于 2013-03-15T23:21:07.137 に答える
0

NOT EXISTS()およびEXCEPT演算子を含むオプション

DECLARE @Name Varchar(25) = 'Judy'       
SELECT *
FROM dbo.CustomerStocks s
WHERE NOT EXISTS (
                  SELECT s3.StockSymbol
                  FROM dbo.CustomerStocks s3
                  WHERE s3.Name = @Name
                  EXCEPT
                  SELECT s2.StockSymbol
                  FROM dbo.CustomerStocks s2
                  WHERE s2.Name = s.Name                        
                  ) AND s.Name != @Name

パフォーマンスを改善するには、このインデックスを使用します

CREATE INDEX ix_StockSymbol_CustomerStocks ON CustomerStocks(StockSymbol) INCLUDE(Name)

SQLFiddle のデモ

于 2013-03-16T08:58:04.757 に答える
0

これはうまくいくはずです:

declare @Name varchar(25) = 'Judy'

select * from CustomerStocks cs
where cs.StockSymbol in 
    (select x.StockSymbol 
     from CustomerStocks x 
     where x.Name = @Name)

または Judy を除外するには:

declare @Name varchar(25) = 'Judy'

select * from CustomerStocks cs
where cs.StockSymbol in 
    (select x.StockSymbol 
     from CustomerStocks x 
     where x.Name = @Name
     and x.Name <> cs.Name)
于 2013-03-15T22:44:25.377 に答える