我在 PostgreSQL 数据库中拥有有关学生 MOOC 表现的数据。我正在尝试整理数据,以便可以将其用于营销漏斗类型的分析。我们的想法是观察这些阶段之间的转变:有多少学生报名,有多少学生打开类(class),有多少学生完成了一半以上的测验,以及有多少学生在所有测验中获得了 >90% 的成绩。
问题是学生多次注册类(class),因此会被多次统计,从而导致数字错误。
这是一些示例数据
|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 |
|====|============|=========|==================|================|
如果我手动检查这些数据,我会为每个人选择“最佳”类(class),其中“最佳”被定义为 percent_progress
和 值最高的类(class)>percent_points
。如果值为 (null)
,则表示他们没有开始类(class)。
以下是我面临的一些问题:
Ken
很简单,因为他参加了 3 次Regression
类(class),但只尝试了一次该类(class)。保存行
01
。Ryu
很复杂,因为他尝试了两次回归
,两次都得到了相同的percent_progress
,但在row< 上得到了更多分数
05
。这个案例让我很困惑,因为我必须比较两列。不过,我们希望为 Ryu 和row
06
保留row
05
因为它来自不同的类:聚类
。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 的情况,他在 percent_progress
上打成平手,而我们必须使用 percent_points
。 (还有其他情况具有相反的模式,因此任何仅使用 percent_points
的硬编码规则都不起作用。
非常感谢任何帮助。
最佳答案
您可以使用distinct on
:
select distinct on (course, student) t.*
from sample t
order by course, student, percent_progress desc nulls last, percent_points desc nulls last;
如果您更喜欢使用两个值的总和,您可以轻松调整:
order by course, student, (percent_progress + percent_points) desc nulls last
关于sql - PostgreSQL 中使用多个条件的复杂重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62546166/