【问题标题】:Sum SQL rows on every nth and group对每 n 个和组的 SQL 行求和
【发布时间】:2020-04-03 16:05:07
【问题描述】:

我的数据如下:

QUARTER_CMT 销售部 7一39 8一23 9一33 10 一个 45 11 一个 50 12 A 110 1乙44 2乙56 3乙87 4乙22

我的目标是通过DEPT 每四个季度获得SALES 的总数,并将Quarter_CNT 数字保留为汇总。

QUARTER_CMT 部门销售_TOT 7个140 11 160 1 B 209

正在进行的代码。我想对总数进行分组并加入最新的QUARTER_CMT 以通过DEPT 获得一行:

选择 ROW_NUMBER() OVER(PARTITION BY DEPTORDER BY QUARTER_CMT) 作为 RN, QUARTER_CMT, 部门, --RANK() OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRankOrg, --NTILE(4) OVER(PARTITION BY ODDZIAL ORDER BY QUARTER_COUNT) AS RowNumberRank, 销售量 从表_1 按部门订购,季度_CMT

【问题讨论】:

    标签: sql group-by partition snowflake-cloud-data-platform


    【解决方案1】:

    试试这个:

    with a as (
      select 
        row_number() over(partition by dept order by quarter_cmt)-1 n, 
        quarter_cmt, dept, sales
      from t
      order by dept, quarter_cmt
    ) 
    select min(quarter_cmt) quarter_cmt, dept, sum(sales) sales_tot
    from a
    group by dept, floor(n/4) 
    order by dept, quarter_cmt
    ;
    

    假设这个样本数据:

    create or replace table t as
    select $1 QUARTER_CMT, $2 DEPT, $3 SALES from values 
      (7,'A',39),
      (8,'A',23),
      (9,'A',33),
      (10,'A',45),
      (11,'A',50),
      (12,'A',110),
      (1,'B',44),
      (2,'B',56),
      (3,'B',87),
      (4,'B',22)
    ;
    

    【讨论】:

      【解决方案2】:

      您需要将 row_number 除为 5 以确定周期

      SELECT MIN (QUARTER_CMT) QUARTER_CMT, DEPT, SUM(SALES) SALES, PART
      FROM (
          SELECT *, FLOOR(ROW_NUMBER() OVER(PARTITION BY DEPT ORDER BY QUARTER_CMT) / 5) AS PART
          FROM TABLE_1
      ) AS T
      GROUP BY DEPT, PART
      ORDER BY DEPT, PART
      

      结果:

      QUARTER_CMT DEPT SALES       PART
      ----------- ---- ----------- -----------
      7           A    140         0
      11          A    160         1
      1           B    209         0
      

      【讨论】:

      • 您能否发布您身边的确切数字除以 5 的结果?在雪花中,除法的结果对我来说很奇怪。
      • 我还在结果中添加了四分之一部分。也许你还需要一个 int 转换。
      • PART 返回以下内容:0.200000, 0.400000, 0.600000, 0.800000, 1.000000, 1.200000
      • 它看起来需要转换为 int。我对此进行了更新。
      • 我运行了嵌套代码并得到了结果:QUARTER_CMT(7), PART(0); QUARTER_CMT(8), PART(0); QUARTER_CMT(9), PART(1); QUARTER_CMT(10), PART(1); QUARTER_CMT(11), PART(1); QUARTER_CMT(12), PART(1)
      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 2019-04-10
      • 1970-01-01
      • 2023-03-15
      • 2013-02-22
      • 2021-06-24
      • 2015-10-19
      • 2013-09-18
      相关资源
      最近更新 更多