sql—postgresql中使用多种条件的复杂重复数据消除

deyfvvtc  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(260)

我在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 因为他参加了 Regression 三次,但只试过一次。保存
row 01 . Ryu 因为他试图 Regression 两次都一样 percent_progress 两次都是,但都得到了更多的分数
row 05 . 这个案子让我很恼火,因为我必须比较两列。尽管如此,我们还是希望
row 05 对于ryu和
row 06 因为它来自不同的班级: 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 不起作用。
非常感谢您的帮助。

8oomwypt

8oomwypt1#

你可以用 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

相关问题