按日期选择表现最佳的销售代表
Selecting the best-performing sales rep by date
给定两个表,sales_reps
和 sales
:
sales_reps
+--------+-------+
| rep_id | name |
+--------+-------+
| 1 | Tony |
+--------+-------+
| 2 | Jim |
+--------+-------+
| 3 | Laura |
+--------+-------+
| 4 | Sam |
+--------+-------+
sales
+------------+----------+--------+-------------+
| sale_date | sales_id | rep_id | sale_amount |
+------------+----------+--------+-------------+
| 2021-01-01 | 1 | 1 | 2000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 2 | 1 | 4000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 3 | 2 | 3000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 4 | 1 | 1000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 5 | 4 | 5000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 6 | 3 | 10000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 7 | 3 | 10000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 8 | 2 | 4000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 9 | 1 | 6000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 10 | 4 | 2000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 11 | 2 | 8000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 12 | 2 | 1000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 13 | 3 | 4500 |
+------------+----------+--------+-------------+
| 2021-01-03 | 14 | 3 | 4500 |
+------------+----------+--------+-------------+
我想显示有多少不同的代表按日期(简单)进行了销售,以及每个日期产生最高总销售额的代表的 rep_id
和 name
。如果不止一位销售代表在某个日期产生了相同的最大总销售额,我想显示较小的 rep_id
和该销售代表的 name
。结果应如下所示:
+------------+-------------+----------+----------+
| sale_date | unique_reps | best_rep | rep_name |
+------------+-------------+----------+----------+
| 2021-01-01 | 3 | 1 | Tony |
+------------+-------------+----------+----------+
| 2021-01-02 | 4 | 3 | Laura |
+------------+-------------+----------+----------+
| 2021-01-03 | 2 | 2 | Jim |
+------------+-------------+----------+----------+
劳拉和吉姆在 2021 年 1 月 3 日的销售额均为 9,000 美元。但是 Jim 的 rep_id
是 2,小于 Laura 的 rep_id
的 3。因此 Jim 显示为在 2021-01-03 产生最大销售额的代表。
Postgres 有一个 mode()
函数,但它不允许您选择哪个代表在关系的情况下选择。为此,您可以更明确:
select distinct on (s.sale_date) s.sale_date,
s.rep_id, sr.name,
count(*) over (partition by s.date) as num_reps
from sales s join
sales_reps sr
on s.rep_id = sr.rep_id
group by s.sale_date, s.rep_id
order by s.sale_date, sum(s.sale_amount) desc, s.rep_id, sr.name;
这是在做什么?它按日期和销售代表汇总。但是,由于 distinct on
,每个日期只占用一行。在这一行中:
count(*) over (partition by date)
计算重复次数(计算 聚合后 的行数)。
s.rep_id
是根据 order by
标准选择的——首先是最多的销售额,然后是最低的代表 ID。
sr.name
是销售代表的名字。
给定两个表,sales_reps
和 sales
:
sales_reps
+--------+-------+
| rep_id | name |
+--------+-------+
| 1 | Tony |
+--------+-------+
| 2 | Jim |
+--------+-------+
| 3 | Laura |
+--------+-------+
| 4 | Sam |
+--------+-------+
sales
+------------+----------+--------+-------------+
| sale_date | sales_id | rep_id | sale_amount |
+------------+----------+--------+-------------+
| 2021-01-01 | 1 | 1 | 2000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 2 | 1 | 4000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 3 | 2 | 3000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 4 | 1 | 1000 |
+------------+----------+--------+-------------+
| 2021-01-01 | 5 | 4 | 5000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 6 | 3 | 10000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 7 | 3 | 10000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 8 | 2 | 4000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 9 | 1 | 6000 |
+------------+----------+--------+-------------+
| 2021-01-02 | 10 | 4 | 2000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 11 | 2 | 8000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 12 | 2 | 1000 |
+------------+----------+--------+-------------+
| 2021-01-03 | 13 | 3 | 4500 |
+------------+----------+--------+-------------+
| 2021-01-03 | 14 | 3 | 4500 |
+------------+----------+--------+-------------+
我想显示有多少不同的代表按日期(简单)进行了销售,以及每个日期产生最高总销售额的代表的 rep_id
和 name
。如果不止一位销售代表在某个日期产生了相同的最大总销售额,我想显示较小的 rep_id
和该销售代表的 name
。结果应如下所示:
+------------+-------------+----------+----------+
| sale_date | unique_reps | best_rep | rep_name |
+------------+-------------+----------+----------+
| 2021-01-01 | 3 | 1 | Tony |
+------------+-------------+----------+----------+
| 2021-01-02 | 4 | 3 | Laura |
+------------+-------------+----------+----------+
| 2021-01-03 | 2 | 2 | Jim |
+------------+-------------+----------+----------+
劳拉和吉姆在 2021 年 1 月 3 日的销售额均为 9,000 美元。但是 Jim 的 rep_id
是 2,小于 Laura 的 rep_id
的 3。因此 Jim 显示为在 2021-01-03 产生最大销售额的代表。
Postgres 有一个 mode()
函数,但它不允许您选择哪个代表在关系的情况下选择。为此,您可以更明确:
select distinct on (s.sale_date) s.sale_date,
s.rep_id, sr.name,
count(*) over (partition by s.date) as num_reps
from sales s join
sales_reps sr
on s.rep_id = sr.rep_id
group by s.sale_date, s.rep_id
order by s.sale_date, sum(s.sale_amount) desc, s.rep_id, sr.name;
这是在做什么?它按日期和销售代表汇总。但是,由于 distinct on
,每个日期只占用一行。在这一行中:
count(*) over (partition by date)
计算重复次数(计算 聚合后 的行数)。s.rep_id
是根据order by
标准选择的——首先是最多的销售额,然后是最低的代表 ID。sr.name
是销售代表的名字。