sql - 根据其他行中列的值选择行

标签 sql r dplyr subquery where-clause

对于这个问题,我会很高兴在 R(理想情况下使用 dplyr 但其他方法也可以)或纯 SQL 中的解决方案。
我有由个人 ( ID ) 和电子邮件地址组成的数据,以及一个表示电子邮件地址是否是个人主要电子邮件地址 (1) 或不是 (0) 的二进制指示符

  • 全部 ID s 有一个且只有一个主电子邮件地址
  • ID s 可以有多个非主电子邮件地址(或没有)
  • ID s 可以与主要和非主要电子邮件地址相同

  • 例如:
       ID Email Primary
    1   1     A       1
    2   1     A       0
    3   1     B       0
    4   2     A       1
    5   2     A       0
    6   3     C       1
    7   4     D       1
    8   4     C       0
    9   5     E       1
    10  5     F       0
    
    (实际数据集大约有一百万行)
    我希望识别电子邮件地址不是主要的 ID,但对于不同的 ID 是主要的。也就是说,我想选择以下行:
  • 主要是 0
  • 存在另一行,其中该 ID 是主要的,但用于不同的 ID

  • 因此,在上面的数据中,我想选择第 5 行(因为电子邮件地址是非主要的,但主要在第 1 行用于不同的 ID 和第 8 行(因为它是非主要的,但主要在第 6 行用于不同的 ID ) 和第 2 行
    对于 R 用户,这是上面的玩具数据框:
    structure(list(ID = c(1, 1, 1, 2, 2, 3, 4, 4, 5, 5), Email = c("A", "A", "B", "A", "A", "C", "D", "C", "E", "F"), Primary = c(1, 0, 0, 1, 0, 1, 1, 0, 1, 0)), class = "data.frame", row.names = c(NA, -10L))
    

    最佳答案

    您可以选择行

  • Primary = 0
  • 数量ID就是这样 Email大于 1。
  • 至少有一个 primary = 1为此Email

  • 使用 dplyr ,你可以这样做:
    library(dplyr)
    
    df %>% 
       group_by(Email) %>% 
       filter(Primary == 0, n_distinct(ID) > 1, any(Primary == 1))
    
    #     ID Email Primary
    #  <dbl> <chr>   <dbl>
    #1     1 A           0
    #2     2 A           0
    #3     4 C           0
    
    既然你有大数据 data.table解决方案会有所帮助:
    library(data.table)
    
    setDT(df)[, .SD[Primary == 0 & uniqueN(ID) > 1 & any(Primary == 1)], Email]
    

    关于sql - 根据其他行中列的值选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64168228/

    相关文章:

    r - 在另一个表的同一行的多列上过滤 df?

    java - Hibernate 在同一张表上使用多个连接

    使用 R 中的 fct_reorder 根据值重新排序因子

    r - 合并具有不同列名的表

    r - ggplot/geom_segment : sorting y-axis labels (factors) according to value of variable

    R:如何分隔字符串并放入不同的列

    r - dplyr 过滤器中的标量比较

    c# - 动态获取照片?

    sql - 带窗函数的运行总和

    php - 两个 SELECT SQL 语句