2017-10-13 25 views
0

一般的な製品を最大限注文したカップルのお客様を選択するのに問題があります。一般的な製品を最大限注文したカップル - SQL

例:A、B、C、Z

  • Customer2、製品を注文
  • :、C、D、G Customer1、製品注文し
  • :G、H、Z
  • をCustomer1、製品を注文

    期待される結果:Customer1 |カスタマー2 |私が試したどのような2(注文した一般的な製品の数)

    select a.cname client_1, b.cname client_2 
    from customers a join customers b on b.cname != a.cname and b.cname > a.cname; 
    

    がどのように私はのカップルのための共通のPIDの最大を得ることができます。これは、名前のすべてのカップルを返し

    SELECT c.pid, c.cid, d.cid, count(c.pid) 
    FROM orders c JOIN orders d join 
    (SELECT a.cid, b.cid FROM customers a JOIN customers b ON b.cname != a.cname AND b.cname > a.cname) as subq 
    ON c.cid = a.cid and d.cid = b.cid 
    AND c.pid = d.pid group by c.pid; 
    

    cids?

    テーブル:

    customers (cid, cname, residence) 
    orders (pid, cid, odate, quantity) 
    products (pid, pname, price, origin) 
    
    +0

    画像ではなく書式付きのテキストを使用してください。 (またはさらに悪いことに、画像へのリンク) – jarlh

    +0

    申し訳ありませんが、私はそれを変更しました – Lou

    答えて

    0

    は、すべてのRDBMSに動作しない場合があります。あなたはどちらを使っていますか?

    select o1.cid, o2.cid, o1.pid, o1.cnt, o2.cnt 
    from (
    select cid, pid, count(*) as cnt 
    , ROW_NUMBER() OVER(PARTITION BY cid, pid ORDER BY count(*) DESC) AS rn 
    from order 
    group by cid, pid 
    ) as o1 
    join (
    select cid, pid, count(*) as cnt 
    , ROW_NUMBER() OVER(PARTITION BY cid, pid ORDER BY count(*) DESC) AS rn 
    from order 
    group by cid, pid 
    ) as o2 
    on o1.cid <> o2.cid 
    and o1.pid = o2.pid 
    
    where o1.rn = 1 
    and o2.rn = 1 
    
    +0

    こんにちは、あなたの答えに感謝します。私はMysqlを使用していますが、それは上の括弧に欠けている括弧があると言いますが、何も見当たりません... – Lou

    +0

    ええ、MySQLは次のバージョンを開始するだけの窓関数をサポートすると思います。 cid(cid、pid、count(*)をcid、pidによる注文グループからcntとして選択する)のような、すべてのサブクエリを 'cid、max(cnt)m_cntから選択するを持つmax(cnt)= outer_query.cnt) ' – Alex

    関連する問題