#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 лучших.