По магазинам (количество), укажите максимальное количество посещений магазина, совершенных покупателем. - PullRequest
0 голосов
/ 30 ноября 2018

Три таблицы, которые я связываю, это item_scan_fact, member_dimension и store_dimension.Пока это то, что у меня есть:

SELECT 
    store_dimension.store_number, 
    member_dimension.member_number  
    COUNT (item_scan_fact.visit_number) AS NumVisits 
FROM 
    member_dimension, 
    item_scan_fact 
    INNER JOIN store_dimension
        ON item_scan_fact.member_key = member_dimension.member_key
       AND item_scan_fact.store_key = store_dimension.store_key 
GROUP BY 
    store_dimension.store_number, 
    member_dimension.member_number, NumVisits;

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Казалось бы, вы хотите:

SELECT member_number, MAX(NumVisits)
FROM (SELECT sd.store_number, md.member_number  
             COUNT(*) AS NumVisits 
      FROM member_dimension md JOIN
           item_scan_fact isf
           ON md.member_key = isf.member_key JOIN
           store_dimension sd
           ON isf.store_key = sd. store_key 
      GROUP BY sd.store_number, md.member_number
     ) sm
GROUP BY member_number;
0 голосов
/ 30 ноября 2018

Если вы хотите возвратить как максимальный, так и соответствующий номер клиента, вы можете применить расширение Teradata SQL, qualify:

SELECT sd.store_number, md.member_number  
       COUNT(*) AS NumVisits 
FROM member_dimension md JOIN
     item_scan_fact isf
     ON md.member_key = isf.member_key JOIN
     store_dimension sd
     ON isf.store_key = sd. store_key 
GROUP BY sd.store_number, md.member_number
QUALIFY
   rank() -- might return multiple rows with the same max, ROW_NUMBER a single row
   over (partition by sd.store_number 
        order by NumVisits desc) = 1
0 голосов
/ 30 ноября 2018

На поверхности это кажется разрешимым с парой Распространенные табличные выражения

Помогает ли это направить вас в правильном направлении?

WITH s1 -- JJAUSSI: Find the visit_number_count by member_key and store_key
AS
(SELECT isf.member_key
       ,isf.store_key
       -- JJAUSSI: DISTINCT resolves a potential 1:N (one to many) relationship here
       ,COUNT( DISTINCT isf.visit_number) AS visit_number_count 
   FROM item_scan_fact isf
  GROUP BY isf.member_key
          ,isf.store_key),
s2 -- JJAUSSI: Find the visit_number_count_max by member_key
AS
(SELECT s1.member_key
       ,MAX(s1.visit_number_count) AS visit_number_count_max
  FROM s1
 GROUP BY s1.member_key)
-- JJAUSSI: Use this version to see the list of store_key values 
-- that have the visit_number_count_max value. This has the potential
-- to be a 1:N relationship.
SELECT s1.member_key
      ,md.member_number 
      ,s1.store_key
      ,sd.store_number
      ,s1.visit_number_count
  FROM s2 INNER JOIN s1
             ON s2.member_key = s1.member_key
            AND s2.visit_number_count_max = s1.visit_number_count
          INNER JOIN store_dimension sd
             ON sd.store_key = s1.store_key
          INNER JOIN member_dimension md
             ON md.member_key = s1.member_key;

Если это то, чтоты собирался за ... поздравления!Перейдем к следующему запросу!

Если вы в конечном итоге после одного store_key ответа для каждого member_key (в основном вы хотите определить «основной» store_key для member_key), то, возможно, потребуется дополнительный шаг(в зависимости от ваших данных).

Вот несколько идей:

  1. Оцените значение member_key на основе некоторого другого суммируемого аспекта item_scan_fact (например, общая заплаченная цена?)
  2. Если вы учитываете все значения store_keyс равными достоинствами, которые имеют одинаковое значение visit_number_count_max для данного ключа member_, просто выберите store_key с MAX или MIN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...