【问题标题】:SUM() Over(Partition By) produces different values to expectedSUM() Over(Partition By) 产生与预期不同的值
【发布时间】:2020-01-14 08:26:08
【问题描述】:

我想按日期和另一列生成运行总计。我有两个表(位置、sales_partner),如下所示:

Location:

|---------------------|------------------|------------------|
|      created_date   |         id       |       sp_id      |
|---------------------|------------------|------------------|
|    2018-01-01       |         34       |        12        |
|---------------------|------------------|------------------|

Salespartner
|---------------------|------------------|
|          id         |       status     |
|---------------------|------------------|
|          12         |      active      |
|---------------------|------------------|

我正在尝试在 YYYY-MM 日期之前获得每个销售合作伙伴的营业地点总数。像这样:

Salespartner
|---------------------|------------------|------------------|
|      YYYY_MM        |         spid     |  location_count  |
|---------------------|------------------|------------------|
|    2018-01-01       |         34       |        12        |
|---------------------|------------------|------------------| 
|    2018-01-01       |         12       |        2         |
|---------------------|------------------|------------------| 
|    2018-01-02       |         34       |        18        |
|---------------------|------------------|------------------| 
|    2018-01-02       |         12       |        6        |
|---------------------|------------------|------------------| 

我知道表中应该总共有 740k 个位置,并且可以在我 count(*) 时确认以下选择查询


SELECT 
    l3.id ,
    sp.sales_partner_id,
    to_date(l3.date_created, 'YYYY-MM') as date            
FROM location as l3
    left join (select id as sales_partner_id,status
              from sales_partner)
              as sp on l3.sales_partner_id = sp.sales_partner_id
GROUP BY 1,2,3

但是当我使用 over(partion by) 执行以下查询时:


SELECT to_date(l3.date_created, 'YYYY-MM') as date,
       sp.sales_partner_id,    
       sum(count(l3.id)) over (partition by sp.sales_partner_id,
                               order by to_date(l3.date_created, 'YYYY-MM') 
                               rows unbounded preceding
                              ) as running_active
FROM location l3 LEFT JOIN
     sales_partner sp
     ON l3.sales_partner_id = sp.sales_partner_id
GROUP BY to_date(l3.date_created, 'YYYY-MM'), sp.sales_partner_id 

sum(running_active) where date = '2019-09-01' 得到的总数是 470k,而不是我知道正确的 740k。我使用的窗口功能有问题吗? sp.sales_partner 列中没有空结果。

【问题讨论】:

  • 您正在按销售合作伙伴进行分区,因此每个合作伙伴的计数都会重新开始。
  • 正确。每个销售合作伙伴重新启动,但所有销售合作伙伴的总和应为 740k。

标签: sql amazon-redshift window-functions


【解决方案1】:

这有点奇怪。我没有看到order by。此外,子查询是不必要的。

这是你想要的吗?

SELECT to_date(l3.date_created, 'YYYY-MM') as date,
       sp.sales_partner_id,    
       sum(count(l3.id)) over (partition by sp.sales_partner_id,
                               order by to_date(l3.date_created, 'YYYY-MM') 
                               rows unbounded preceding
                              ) as running_active
FROM location l3 LEFT JOIN
     sales_partner sp
     ON l3.sales_partner_id = sp.sales_partner_id
GROUP BY to_date(l3.date_created, 'YYYY-MM'), sp.sales_partner_id 

【讨论】:

  • 啊是的,那是我使用的查询(我使用了子查询,我应该删除它),在输入时错过了订单。已修改原问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多