Как получить данные за последние x недель для каждого типа?

#sql #amazon-web-services #amazon-redshift

#sql #amazon-веб-сервисы #amazon-redshift

Вопрос:

У меня есть запрос ниже, который дает мне данные с тремя столбцами — type amount и total за предыдущую неделю с использованием week_number столбца.

 select type,
case
WHEN (type = 'PROC1' AND contractdomicilecode = 'UIT') THEN 450
WHEN (type = 'PROC1' AND contractdomicilecode = 'KJH') THEN 900
WHEN (type = 'PROC2' AND contractdomicilecode = 'LOP') THEN 8840
WHEN (type = 'PROC2' AND contractdomicilecode = 'AWE') THEN 1490
WHEN (type = 'PROC3' AND contractdomicilecode = 'MNH') THEN 1600
WHEN (type = 'PROC3' AND contractdomicilecode = 'LKP') THEN 1900
END as amount,
total
from xyz.orders pa
join
(select clientid as clientid, max(version) as version
from xyz.orders where consumerid IN (select distinct entity_id from abc.items
where week_number = extract(week from current_date) - 1
and item_type like '%Ionize - Data%' )
and createdfor ='BLOCK'
and holder='RELAY_FUTURES'
group by clientid) pb on
pa.clientid = pb.clientid and pa.version = pb.version;
  

Ниже приведен результат, который я получаю на данный момент с приведенным выше запросом:

 type    amount      total
---------------------------
PROC1    450         1768
PROC1    900         123
PROC1    450         456
PROC2    8840        99897
PROC2    1490        2223
PROC2    8840        9876
PROC3    1900        23456
PROC3    1600        12498
PROC3    1600        28756
  

Постановка задачи

Теперь я пытаюсь найти способ, с помощью которого я могу получить данные за последние 6 недель (не включая текущую неделю). По сути, я хочу получить amount total для каждого типа за последние 6 недель, как показано ниже.

  week   type    amount      total
----------------------------------
  46    PROC1    450         1768
  46    PROC1    900         123
  46    PROC1    450         456
  46    PROC2    8840        99897
  46    PROC2    1490        2223
  46    PROC2    8840        9876
  46    PROC3    1900        23456
  46    PROC3    1600        12498
  46    PROC3    1600        28756
  45    PROC1    450         1768
  45    PROC1    900         123
  45    PROC1    450         456
  45    PROC2    8840        99897
  45    PROC2    1490        2223
  45    PROC2    8840        9876
  45    PROC3    1900        23456
  45    PROC3    1600        12498
  45    PROC3    1600        28756
  44    PROC1    450         1768
  44    PROC1    900         123
  44    PROC1    450         456
  44    PROC2    8840        99897
  44    PROC2    1490        2223
  44    PROC2    8840        9876
  44    PROC3    1900        23456
  44    PROC3    1600        12498
  44    PROC3    1600        28756
  43    PROC1    450         1768
  43    PROC1    900         123
  43    PROC1    450         456
  43    PROC2    8840        99897
  43    PROC2    1490        2223
  43    PROC2    8840        9876
  43    PROC3    1900        23456
  43    PROC3    1600        12498
  43    PROC3    1600        28756
  42    PROC1    450         1768
  42    PROC1    900         123
  42    PROC1    450         456
  42    PROC2    8840        99897
  42    PROC2    1490        2223
  42    PROC2    8840        9876
  42    PROC3    1900        23456
  42    PROC3    1600        12498
  42    PROC3    1600        28756
  41    PROC1    450         1768
  41    PROC1    900         123
  41    PROC1    450         456
  41    PROC2    8840        99897
  41    PROC2    1490        2223
  41    PROC2    8840        9876
  41    PROC3    1900        23456
  41    PROC3    1600        12498
  41    PROC3    1600        28756
  

Возможно ли это сделать случайно?

Ответ №1:

Вы можете попробовать добавить следующий код в свой запрос сразу после первого select в строке 1, если столбец current_date присутствует в xyz.orders таблице:

 extract(week from current_date) as week,
  

Чтобы получить прошедшее количество недель (6 в вашем случае), фильтр будет использоваться после строки from xyz.orders pa :

 where datediff(week, extract(week, current_date)-6, extract(week, current_date) 1) = 6
  

Возможно, потребуется немного скорректировать фильтр, но когда вы увидите результат, вы сможете найти то, что нужно скорректировать.

Полезной ссылкой может быть дополнительная информация о DATEDIFF функции, используемой в приведенном выше фильтре из документов MS.

learn.microsoft.com

С учетом вышеуказанных изменений, вот обновленный запрос и комментарии относительно особенностей, добавленных из вашего исходного кода.

 select
    extract(week from current_date) as week, -- added code
    type,
    case
        WHEN (type = 'PROC1' AND contractdomicilecode = 'UIT') THEN 450
        WHEN (type = 'PROC1' AND contractdomicilecode = 'KJH') THEN 900
        WHEN (type = 'PROC2' AND contractdomicilecode = 'LOP') THEN 8840
        WHEN (type = 'PROC2' AND contractdomicilecode = 'AWE') THEN 1490
        WHEN (type = 'PROC3' AND contractdomicilecode = 'MNH') THEN 1600
        WHEN (type = 'PROC3' AND contractdomicilecode = 'LKP') THEN 1900
    END as amount,
    total
    from xyz.orders pa
    where datediff(week, extract(week, current_date)-6, extract(week, current_date) 1) = 6 -- added code
    join
    (select clientid as clientid, max(version) as version
        from xyz.orders where consumerid IN (select distinct entity_id from abc.items
        where week_number = extract(week from current_date) - 1
        and item_type like '%Ionize - Data%' )
        and createdfor ='BLOCK'
        and holder='RELAY_FUTURES'
        group by clientid) pb on
        pa.clientid = pb.clientid and pa.version = pb.version;
  

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

1. да, но как я могу получить все эти данные за последние 6 недель?

2. Попробуйте фильтр выше в обновленном ответе. Кроме того, предоставленная ссылка на официальные документы по используемой функции может оказать некоторую помощь.

3. Итак, что происходит с этим условием внутри моего внутреннего запроса — where week_number = extract(week from current_date) - 1 ? Я немного запутался. Можете ли вы предоставить обновленный пример запроса с вашим предложением?

4. Ответ обновляется. Я считаю, что в этом внутреннем запросе для указанной вами строки он фильтрует записи на 1 неделю назад из current_date .

5. да, так что эту 6-недельную вещь не нужно там изменять? Я просто хотел убедиться