2016-05-10 2 views
-4

Пример:запросов для извлечения аналогичных продуктов, купленных клиентом в SQL-сервер БД

C NAME PRODUCT  DATE OF PURCHASE 
    **JOHN MILK  12/17/2015** 
    **JOHN BREAD  12/17/2015** 
    John  soap  12/17/2015 
    **John milk  03/21/2016** 
    **John bread  03/21/2016** 
    John laptop  03/21/2016 
    John pen   07/30/2015 
    John Refils  07/30/2015 
    John Pen   08/05/2016 
    John Refils  08/05/2016 

По вышеприведенном примере мы можем сказать, г-н Джон всегда приобрести «МОЛОКО» & «ХЛЕБ» (имею в виду, когда он когда-нибудь покупает Молоко он покупает Хлеб аналогично Pen & Refils)

Может ли кто-нибудь отправить мне запрос для вышеуказанного примера?

+0

Можете ли вы поделиться запрос –

+0

I'ts мне не ясно, если пример содержит примеры данных или нужного результата; основываясь на этом, можете ли вы добавить отсутствующий (начальные данные или необходимый результат)? – Aleksej

+0

В вашем примере г-н Джон всегда покупает Pen & Refils слишком – Carlo

ответ

-1

Это один (некрасиво, но работает) способ достижения этого -

select C_Name, product 
from products p1 
where date_of_purchase = (select min(date_of_purchase) 
                from products p2     
                where p1.C_Name = p2.C_Name) 
and product not in (select product 
            from products p3 
            where p1.C_Name = p3.C_Name 
            and date_of_purchase <> (select min(date_of_purchase) 
                        from products p4 
                        where p3.C_Name = p4.C_Name)) 
+0

Я попробовал ваш запрос, но в результате я получил «John soap» – Carlo

0

Если кажется, что вы хотите, чтобы выполнить какое-то топ-анализа корзины ваших данных. Если это так, вы можете использовать следующий пакет DBMS_FREQUENT_ITEMSET.

Вот несколько хороших ссылок на то же самое.

https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_frqist.htm https://technology.amis.nl/2004/10/16/hidden-plsql-gem-in-10g-dbms_frequent_itemset-for-plsql-based-data-mining/

0

Это способ, чтобы получить результат, возвращая продукты, сгруппированных в пары:

SELECT UPPER(t1.c_name), UPPER(t1.product), UPPER(t2.product), COUNT(*) 
FROM products t1, products t2 
WHERE UPPER(t1.c_name) = UPPER(t2.c_name) 
    AND t1.dt_purchase = t2.dt_purchase 
    AND UPPER(t1.product) < UPPER(t2.product) 
GROUP BY UPPER(t1.c_name), UPPER(t1.product), UPPER(t2.product) 
HAVING COUNT(*) = (
    SELECT COUNT(*) 
    FROM products t3 
    WHERE UPPER(t3.c_name) = UPPER(t1.c_name) 
     AND UPPER(t3.product) = UPPER(t1.product) 
) AND COUNT(*) = (
    SELECT COUNT(*) 
    FROM products t3 
    WHERE UPPER(t3.c_name) = UPPER(t1.c_name) 
     AND UPPER(t3.product) = UPPER(t2.product) 
); 

Запрос присоединяется таблицу с собой поиск пары продукта куплен совмещены во всех закупках даты представлены в таблице.

Это возвращает следующий результат:

JOHN BREAD MILK 
JOHN PEN  REFILS 
+0

Привет, Carlo Ce, благодарю вас за ответ ur. Я попробовал ур-запрос, но у меня есть «Null». .. – user3775637

+0

Привет, я забыл обработать случай с символом и количество записей. Я исправил ответ. Извините за ошибку – Carlo