【问题标题】:Complex deduplication in PostgreSQL using multiple conditionsPostgreSQL 中使用多个条件的复杂重复数据删除
【发布时间】: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_progresspercent_points 的值最高的课程。如果值为(null),则表示他们没有开始课程。

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

  1. Ken 很简单,因为他注册了 Regression 3 次,但只尝试了一次。保存row01
  2. Ryu 很复杂,因为他尝试了两次Regression,两次都得到了相同的percent_progress,但在row05 上得到了更多的分数。这种情况让我很失望,因为我必须比较 both 列。尽管如此,我们希望为 Ryu 保留 row 05 row 06,因为它来自不同的类:Clustering
  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's 这样的情况,他与percent_progress 打成平手,而我们不得不使用percent_points。 (还有其他情况相反的模式,所以任何硬编码规则说只使用percent_points 都行不通。

非常感谢任何帮助。

【问题讨论】:

    标签: sql postgresql duplicates


    【解决方案1】:

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

    【讨论】:

    • 这只是随机选择一行,并没有捕获我指定的条件:percent_progress 和 percent_points 的最大组合。
    • @NLR 。 . .它不是随机的。它首先选择最大百分比,然后选择最大点,这似乎就是您所描述的。
    • @Gordon——我完全错过了订单。这钉住了它。非常感谢!
    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 2021-12-16
    • 2017-09-12
    • 2020-08-17
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多