sql - PostgreSQL 中使用多个条件的复杂重复数据删除

标签 sql postgresql duplicates

我在 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)。

以下是我面临的一些问题:

  1. Ken 很简单,因为他参加了 3 次 Regression 类(class),但只尝试了一次该类(class)。保存 01
  2. Ryu 很复杂,因为他尝试了两次回归,两次都得到了相同的percent_progress,但在 row< 上得到了更多分数 05。这个案例让我很困惑,因为我必须比较两列。不过,我们希望为 Ryu row 06 保留 row 05 因为它来自不同的类:聚类
  3. 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() 函数,我尝试了它,但我做错了,因为它没有按 coursestudent 分组,然后根据两个性能列进行排名。我也不知道它将如何处理像 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/

相关文章:

mysql - 在 DbVisualizer 中创建 HSQLDB 过程

php - 不间断的cronjob

python - SQLAlchemy:如何过滤 PgArray 列类型?

postgresql - 为什么 "||"在 PostgreSQL/Redshift 中用作字符串连接

R - 删除 "one after another"重复项

c++ - 如何从 C++ 中的 vector 中删除几乎重复项

php - MySQL SELECT SUM 基于另一个表(另一个案例)

c# - 通过循环检查列表框从数据库表中填充和删除项目

mysql - 如何连接表以便包含没有匹配项的行?

ruby-on-rails - Postgres查询查找数据库是否为只读模式