7

次のような(省略された)テーブルがあります。

| order_id  | item_id   | amount    | qty   | date          |
|---------- |---------  |--------   |-----  |------------   |
| 1         | 1         | 10        | 1     | 10-10-2014    |
| 1         | 2         | 20        | 2     | 10-10-2014    |
| 2         | 1         | 10        | 1     | 10-12-2014    |
| 2         | 2         | 20        | 1     | 10-12-2014    |
| 2         | 3         | 45        | 1     | 10-12-2014    |
| 3         | 1         | 10        | 1     | 9-9-2014      |
| 3         | 3         | 45        | 1     | 9-9-2014      |
| 4         | 2         | 20        | 1     | 11-11-2014    |

最も頻繁に一緒に発生するアイテムのリストを計算するクエリを実行したいと思います。

この場合、結果は次のようになります。

|items|frequency|
|-----|---------|
|1,2, |2        |
|1,3  |1        |
|2,3  |1        |
|2    |1        |

理想的には、最初に複数のアイテムを含む注文を提示し、次に最も頻繁に注文される単一のアイテムを提示します。

この SQL を構造化する方法の例を教えてください。

4

2 に答える 2

3

このクエリは、2 つの項目が同時に発生する場合に、要求されたすべての出力を生成します。単一の値 (2) は技術的には何も一緒に発生しないため、要求された出力の最後の項目は含まれません... ただし、UNION クエリを追加して、単独で発生する値を含めることは簡単にできます。

これはPostgreSQL 9.3用に書かれています

 create table orders(
        order_id int, 
        item_id int, 
        amount int, 
        qty int, 
        date timestamp


);

INSERT INTO ORDERS VALUES(1,1,10,1,'10-10-2014');
INSERT INTO ORDERS VALUES(1,2,20,1,'10-10-2014');
INSERT INTO ORDERS VALUES(2,1,10,1,'10-12-2014');
INSERT INTO ORDERS VALUES(2,2,20,1,'10-12-2014');
INSERT INTO ORDERS VALUES(2,3,45,1,'10-12-2014');
INSERT INTO ORDERS VALUES(3,1,10,1,'9-9-2014');
INSERT INTO ORDERS VALUES(3,3,45,1,'9-9-2014');
INSERT INTO ORDERS VALUES(4,2,10,1,'11-11-2014');

with order_pairs as (
    select (pg1.item_id, pg2.item_id) as items, pg1.date
    from 
    (select distinct item_id, date
    from orders) as pg1
    join
    (select distinct item_id, date
    from orders) as pg2
    ON 
    (
    pg1.date = pg2.date AND
    pg1.item_id != pg2.item_id AND
    pg1.item_id < pg2.item_id

    )
    )

    SELECT items, count(*) as frequency
    FROM order_pairs
    GROUP by items
    ORDER by items;

出力

 items | frequency 
-------+-----------
 (1,2) |         2
 (1,3) |         2
 (2,3) |         1
(3 rows)
于 2015-09-05T03:25:42.007 に答える