【发布时间】: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