如何获取每种类型过去 x 周的数据?
Posted
技术标签:
【中文标题】如何获取每种类型过去 x 周的数据?【英文标题】:How to get data for the past x weeks for each type? 【发布时间】:2020-11-18 16:17:51 【问题描述】:我有以下查询,它为我提供了三列数据 - 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】:如果xyz.orders
表中存在current_date
列,您可以尝试将以下代码添加到您的查询中,就在第1 行的第一个select
之后:
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
过滤器可能需要稍微调整,但是当您看到输出时,您应该能够找到需要调整的内容。
MS 文档中上述过滤器中使用的DATEDIFF
函数中的一些更多信息可能是有用的参考。
docs.microsoft.com
通过上述更改,这里是更新后的查询和 cmets,以了解从您的原始代码中添加的细节。
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;
【讨论】:
是的,但是我怎样才能获得过去 6 周的所有这些数据呢? 在更新的答案中试用上面的过滤器。此外,提供了有关所使用功能的官方文档的链接,可能会有所帮助。 那么在我的内部查询-where week_number = extract(week from current_date) - 1
中这种情况会发生什么?我有点困惑。您能否提供更新后的查询示例以及您的建议?
答案已更新。我相信内部查询,对于您指定的行,它正在过滤来自current_date
1 周前的记录。
是的,所以这 6 周的东西不需要在那里修改吗?我只是想确定以上是关于如何获取每种类型过去 x 周的数据?的主要内容,如果未能解决你的问题,请参考以下文章