How to get data for the past x weeks for each type?

落爺英雄遲暮 提交于 2021-02-11 12:54:49

问题


I have below query which gives me data with three columns - type, amount and total for previous week using week_number column.

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;

Below is the output I get back as of now with above query:

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

Problem Statement

Now I am trying to figure out a way by which I can get data for past 6 weeks (not including current week). Basically I want to get amount, total for each type for past 6 weeks as shown below.

 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

Is this possible to do by any chance?


回答1:


You may try adding the following code to your query, right after the first select in line 1, if the column current_date is present in the xyz.orders table:

extract(week from current_date) as week,

To obtain the past number of weeks (6 in your case), a filter will be used after the line of from xyz.orders pa:

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

The filter might need to be slightly adjusted, but when you see the output you should be able to find what needs to be adjusted.

Some more info in the DATEDIFF function used in the filter above from the MS docs might be a helpful reference.

docs.microsoft.com

With the above changes, here is the updated query and comments as to the specifics added from your original code.

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;


来源:https://stackoverflow.com/questions/64897019/how-to-get-data-for-the-past-x-weeks-for-each-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!