Получить 3 самых посещаемых клиента из таблицы T1 и получить 5 лучших продуктов, каждый из которых покупает из таблицы T2

#sql #db2

#sql #db2

Вопрос:

Мне нужно получить 3 самых посещаемых клиента из таблицы T1 и получить 5 лучших продуктов, КОТОРЫЕ КАЖДЫЙ ИЗ НИХ покупает из таблицы T2.

ТАБЛИЦУ T1 КИРК посетил 3 раза, Халк 3 раза, Джон 2 раза .. так что эти три должны быть выбраны только. Тор и парень из Rndm посетили один раз, поэтому они ушли, так как нужно было выбрать только три лучших

 Table 1 (T1)
-----------------------------------
NAME       AGE   VISITOR CODE
-----------------------------------
KIRK     18    1285
THOR     99    1284
KIRK     18    1285
HULK     19    1286
KIRK     18    1285
JOHN     19    0007   
HULK     19    1286
JOHN     19    0007
HULK     19    1286
RNDM     19    0008


 Table 2 (T2)
-----------------------------------
PRODUCT  MRP   VISITOR CODE    --EXAMPLE ONLY FOR KIRK TOP 3 PRODS ARE A then D then C.
-----------------------------------
A        111    1285
A        111    1285
A        111    1285
B        191    1285
C        192    1285
C        192    1285
D        190    1285
D        190    1285
D        190    1285
D        190    1285
  

ТО, ЧТО Я ПОПРОБОВАЛ, ЭТО :

 SELECT                              
       T2.PRODUCT ,                  
       COUNT(*) AS X                  
  FROM T1,T2
 WHERE T2.VISITOR CODE =
      (SELECT                              
              T1.VISITOR CODE ,                  
              COUNT(*) AS X                  
       FROM  T1,T2
       GROUP BY T1.VISITOR CODE 
       ORDER BY X DESC        
       FETCH FIRST 3 ROWS ONLY)
 GROUP BY T1.VISITOR CODE 
 ORDER BY X DESC
  

ПРОБЛЕМА В ТОМ, что мне нужен только КОД T1.VISITOR из подзапроса, чтобы соответствовать КОДУ T2.VISITOR таблицы T2.
Но я также использовал count в подзапросе таблицы T1.

ВЫХОДНОЙ РЕЗУЛЬТАТ:

 NAME     PRODUCT     VISITOR CODE 
KIRK     A           1285
KIRK     D           1285
KIRK     C           1285
HULK     C           1286
HULK     A           1286
HULK     B           1286 -- AND THEN  JOHN AND HIS 3 PRODUCTS
  

Комментарии:

1. FROM T1,T2 T1 и t2 никак не соединены, поэтому вы получите картезианский продукт.

2. @wildplasser Я считаю, что код посетителя является ключевым между ними

Ответ №1:

Вы можете использовать производные таблицы для решения этого запроса. Первая производная таблица содержит 3 лучших посетителя, которые присоединяются ко 2-й производной таблице, которая содержит 5 лучших продуктов для каждого посетителя.

 SELECT t1.*, t2.*
FROM
    (SELECT
        NAME,
        AGE,
        VISITOR_CODE,
        COUNT(*) VISIT_COUNT
    FROM
        TABLE1t t1
    GROUP BY VISITOR_CODE
    ORDER BY VISIT_COUNT DESC LIMIT 3) t1
JOIN (
    SELECT 
        PRODUCT,
        MRP,
        VISITOR_CODE,
        RANK() OVER 
        (PARTITION BY t3.VISITOR_CODE ORDER BY t3.product_count DESC) AS rank
    FROM (
        SELECT
            PRODUCT,
            MRP,
            VISITOR_CODE,
            COUNT(*) product_count
        FROM TABLE2
        GROUP BY
            PRODUCT,
            MRP,
            VISITOR_CODE
    ) t3 WHERE rank <= 5
) t2 ON t1.VISITOR_CODE = t2.VISITOR_CODE
  

Комментарии:

1. вы указали предыдущий код посетителя. Но предыдущий код посетителя нигде не хранится?

2. @AgentMahone, по какой-то причине я думал, что ты используешь mysql. Обновлен запрос для db2, хотя я не уверен, что он правильный. Попробуйте 🙂

3. Я не понимаю, как мы получаем 5 лучших продуктов для каждого посетителя. например, Кирк был лучшим посетителем.. таким образом, на выходе должен быть показан КИРК с 5 лучшими продуктами, которые он купил, KIRK PROD A, KIRK PROD B .. и т. Д. затем Халк придет со своими 5 продуктами, а затем третий посетитель со своими 5 самыми покупаемыми продуктами

4. Количество продуктов @AgentMahone для всех комбинаций посетитель / продукт / mrp извлекается из производной таблицы t3 . Эти результаты ранжируются, RANK() OVER ... и для каждого посетителя сохраняются только 5 лучших.