如何获取每种类型过去 x 周的数据?

Posted

技术标签:

【中文标题】如何获取每种类型过去 x 周的数据?【英文标题】:How to get data for the past x weeks for each type? 【发布时间】:2020-11-18 16:17:51 【问题描述】:

我有以下查询,它为我提供了三列数据 - typeamounttotal 前一周使用 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 周(不包括本周)的数据。基本上我想得到amounttotal 过去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 周的数据?的主要内容,如果未能解决你的问题,请参考以下文章

子查询在获取过去 X 周的数据时出现太多列错误?

Mysql 使用 JOIN 获取过去六周的数据

如何在 MSSQL 中获取最近 6 周的开始日期和结束日期

将 52 周的数据拆分为 12 个月

如何在 Laravel 5.1 中获取前一周的数据?

如何以当天为搜索点获取同月前几周的数据