【问题标题】:big query compare two weeks' data大查询比较两周的数据
【发布时间】:2021-11-19 14:18:12
【问题描述】:

我有一个大查询表。像这样:

date(week)   vendor_name     value
2021-11-14   rick            8000
2021-11-14   rose            7000
2021-11-14   axel            6500
2021-11-14   boris           6000
2021-11-14   cliff           5500
2021-11-07   rose            9500
2021-11-07   axel            8750
2021-11-07   rick            4000
2021-11-07   dean            3500
2021-11-07   evan            3000
.....

日期栏表示每周的开始日期。 vendor_name 列显示了该周销量最高的 5 个供应商。值列显示总销售额。每周的顶级供应商可能会有所不同。预期输出:

date(week)  vendor_name      value   previous_date  previous_top_vendors  previous_value   change
2021-11-14   rick            8000    2021-11-07     rose                  9500             -%26
2021-11-14   rose            7000    2021-11-07     axel                  8750             -25
2021-11-14   axel            6500    2021-11-07     rick                  4000             %100
2021-11-14   boris           6000    2021-11-07     dean                  3500             Null
2021-11-14   cliff           5500    2021-11-07     evan                  3000             Null

收到最新日期后,会到上一周的数据。在这两周内,将比较卖家,他们的变化百分比将显示在名为“变化”的列中。

注意:供应商的排名可能每周都会发生变化。可以对新的供应商进行排名(在这种情况下,它应该在“更改”列中显示为 Null)

我试过了:

SELECT * FROM (select*from `table.top20_vendor` where date = '2021-11-14'),
(select date as previous_date, vendor_name as previous_top_vendors,value as previous_value 
from `table.top20_vendor` where date ='2021-11-07')

但输出不正确:

date(week)  vendor_name      value   previous_date  previous_top_vendors  previous_value
2021-11-14   rick            8000    2021-11-07     rose                  9500   
2021-11-14   rick            8000    2021-11-07     axel                  8750   
2021-11-14   rick            8000    2021-11-07     rick                  4000
2021-11-14   rick            8000    2021-11-07     dean                  3500             
2021-11-14   rick            8000    2021-11-07     evan                  3000             

另外,我不知道如何计算“变化”列

【问题讨论】:

    标签: sql google-bigquery compare


    【解决方案1】:

    我首先做的是获取所需周的前 5 个值,我使用了以下查询:

    select * from
    (
    select date, vendor_name, value , row_number() over(partition by date order by value desc) as rn
    from `project.dataset.table`
    )A
    where rn<=5 and date='2021-11-14'
    

    然后,需要做的是改变值。为此,您需要使用百分比公式,并按供应商的名称加入这几周的价值。

     SELECT prev_week.rn,((curr_week.value-prev_week.value)/prev_week.value)*100 as change FROM curr_week right join  prev_week on curr_week.vendor_name = prev_week.vendor_name
    

    考虑以下方法:

    with curr_week as(
    select * from
    (
    select date, vendor_name, value , row_number() over(partition by date order by value desc) as rn
    from `project.dataset.table`
    )A
    where rn<=5 and date='2021-11-14'
    ),
    prev_week as (
       select * from
    (
    select date, vendor_name, value , row_number() over(partition by date order by value desc) as rn
    from `project.dataset.table`
    )A
    where rn<=5 and date='2021-11-07'
    ),
    changes as(
       SELECT prev_week.rn,((curr_week.value-prev_week.value)/prev_week.value)*100 as change FROM curr_week right join  prev_week on curr_week.vendor_name = prev_week.vendor_name
    )
     
    select curr_week.date,
    curr_week.vendor_name,
    curr_week.value,
    prev_week.date as previous_date,
    prev_week.vendor_name as previous_top_vendors,
    prev_week.value as previous_value,
    changes.change
    from curr_week left join prev_week on curr_week.rn = prev_week.rn
    left join changes on prev_week.rn = changes.rn
    

    我得到的结果如下:

    【讨论】:

    • 它的工作。非常感谢。
    【解决方案2】:

    我仍然不明白您在比较哪些记录方面的更改逻辑,但这应该可以帮助您在几周之间比较供应商及其价值:

    with sample_data as (
        select '2021-11-14' as week,   'rick' as vendor_name,            8000 as value UNION ALL 
        select '2021-11-14' as week,   'rose' as vendor_name,            7000 as value UNION ALL 
        select '2021-11-14' as week,   'axel' as vendor_name,            6500 as value UNION ALL 
        select '2021-11-14' as week,   'boris' as vendor_name,           6000 as value UNION ALL 
        select '2021-11-14' as week,   'cliff' as vendor_name,           5500 as value UNION ALL 
        select '2021-11-07' as week,   'rose' as vendor_name,            9500 as value UNION ALL 
        select '2021-11-07' as week,   'axel' as vendor_name,            8750 as value UNION ALL 
        select '2021-11-07' as week,   'rick' as vendor_name,            4000 as value UNION ALL 
        select '2021-11-07' as week,   'dean' as vendor_name,            3500 as value UNION ALL 
        select '2021-11-07' as week,   'evan' as vendor_name,            3000 as value
    )
    ,
    ranked_data as (
        select dense_rank() over (order by week desc) week_rank
        , rank() over (partition by week order by value) vendor_rank
        , *
    from sample_data
    )
    select curr_week.week
        , curr_week.vendor_name
        , curr_week.value
        , prev_week.week as previous_week
        , prev_week.vendor_name as previous_top_vendors
        , prev_week.value as previous_value
        , 
    from ranked_data curr_week
    left join ranked_data prev_week
     on curr_week.vendor_rank=prev_week.vendor_rank
     and prev_week.week_rank=2
    where curr_week.week_rank=1
    order by 3 desc
    
    

    最终,我认为您需要领先或落后,具体取决于中间步骤中的计算。如果您能详细说明一下,我也许可以添加该组件以进行更改。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2011-12-06
      • 2017-09-21
      • 2019-05-23
      • 1970-01-01
      • 2019-10-25
      • 2014-10-17
      • 2010-11-27
      • 2011-04-15
      相关资源
      最近更新 更多