#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.
С учетом вышеуказанных изменений, вот обновленный запрос и комментарии относительно особенностей, добавленных из вашего исходного кода.
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-недельную вещь не нужно там изменять? Я просто хотел убедиться