【发布时间】:2020-10-14 04:30:54
【问题描述】:
我有 PostgreSQL 数据库中关于学生 MOOC 表现的数据。我正在尝试处理数据,以便可以在营销漏斗类型分析中使用它。我们的想法是观察这些阶段之间的过渡:有多少学生注册,有多少人开设课程,有多少人参加了超过一半的测验,有多少人的所有测验都获得了 90% 以上的分数。
问题是学生多次注册课程,所以他们被多次计算,这使得数字错误。
这是一些示例数据
|row | course | student | percent_progress | percent_points |
|====|============|=========|==================|================|
| 01 | Regression | Ken | 0.467 | 0.455 |
| 02 | Regression | Ken | (null) | (null) |
| 03 | Regression | Ken | (null) | (null) |
| 04 | Regression | Ryu | 0.455 | 0.446 |
| 05 | Regression | Ryu | 0.455 | 0.459 |
| 06 | Clustering | Ryu | (null) | (null) |
| 07 | Regression | Guile | 0.182 | 0.054 |
| 08 | Regression | Guile | 0.182 | 0.054 |
|====|============|=========|==================|================|
如果我要手动查看这些数据,我会为每个人选择“最佳”课程,其中“最佳”定义为 percent_progress 和 percent_points 的值最高的课程。如果值为(null),则表示他们没有开始课程。
以下是我面临的一些问题:
-
Ken很简单,因为他注册了Regression3 次,但只尝试了一次。保存row01。 -
Ryu很复杂,因为他尝试了两次Regression,两次都得到了相同的percent_progress,但在row05上得到了更多的分数。这种情况让我很失望,因为我必须比较 both 列。尽管如此,我们希望为 Ryu 保留row05和row06,因为它来自不同的类:Clustering。 -
Guile是直接重复的。
上表的输出将是:
|row | course | student | percent_progress | percent_points |
|====|============|=========|==================|================|
| 01 | Regression | Ken | 0.467 | 0.455 |
| 05 | Regression | Ryu | 0.455 | 0.459 |
| 06 | Clustering | Ryu | (null) | (null) |
| 07 | Regression | Guile | 0.182 | 0.054 |
|====|============|=========|==================|================|
我需要检查几个不同的条件,我什至不知道从哪里开始。有人推荐使用rank()函数,我试了一下,但我做错了,因为它没有按course和student分组,然后根据两个性能列进行排名。我也不知道它将如何处理像Ryu's 这样的情况,他与percent_progress 打成平手,而我们不得不使用percent_points。 (还有其他情况相反的模式,所以任何硬编码规则说只使用percent_points 都行不通。
非常感谢任何帮助。
【问题讨论】:
标签: sql postgresql duplicates