按日期选择表现最佳的销售代表

时间:2021-06-12 01:10:34

标签: sql postgresql group-by max aggregate-functions

给定两个表,sales_repssales

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_idname。如果超过一个代表在某个日期产生了相同的最大总销售额,我想显示较小的 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 产生最大销售额的代表。

1 个答案:

答案 0 :(得分:1)

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 是销售代表的姓名。