【问题标题】:How to find the distinct of one column based on other columns如何根据其他列查找一列的不同
【发布时间】:2016-02-20 00:26:20
【问题描述】:

我有一个如下所示的数据框

col1    col2    col3
A       Z       10
A       Y       8
A       Z       15
B       X       11
B       Z       7
C       Y       10
D       Z       11
D       Y       14
D       L       16

我必须为每个distinct col1 选择col2 中的哪一个max(col3)

输出数据框应该是这样的,

col1    col2    col3
A       Z       15
B       X       11
C       Y       10
D       L       16

如何在RSQL 中执行此操作

提前致谢

【问题讨论】:

  • 你想如何处理领带?
  • 还有library(data.table) ; unique(setorder(setDT(df), -col3), by = "col1"),虽然如前所述,不清楚你想如何处理关系。
  • 对于每组只返回一个单行的 dplyr 方法(在平局的情况下也是如此),请参阅stackoverflow.com/questions/21308436
  • @docendo-discimus:95%没有关系,剩下的,只要有人来就行。
  • @DavidArenburg:感谢您的解决方案 :)

标签: mysql sql r groupwise-maximum


【解决方案1】:

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(df1)),按'col1'分组,我们根据'col3'的最大值索引子集data.table(.SD

library(data.table)
setDT(df1)[, .SD[which.max(col3)], col1]
#     col1 col2 col3
#1:    A    Z   15
#2:    B    X   11
#3:    C    Y   10
#4:    D    L   16

或者我们可以在按'col1'分组后使用dplyr中的top_n

library(dplyr)
df1 %>%
      group_by(col1) %>%
      top_n(1)

【讨论】:

  • 非常感谢您的快速响应。 :) 它不允许像您回答的那样快地接受您的回答。
  • @ManojG 感谢您的反馈。我想大概需要 10 分钟左右。
  • 您在 dplyr 和 data.table 中的解决方案会因关系不同而有所不同。只是说
  • @akrun:我在数据框中应用了 data.table 解决方案,其中包含大约 7million 行,大约在 4.7 million unique col1 附近,但我得到的输出是 1.5 million rows。知道出了什么问题吗?
  • @akrun:谢谢!我会试试这个:)
【解决方案2】:

在 MySQL 中的另一种方式。

这里是SQLFiddle Demo

输出:=>

SELECT T1.*
FROM
table_name T1
INNER JOIN 
(SELECT col1,MAX(col3) AS Max_col3 FROM table_name GROUP BY col1) T2 
            ON T1.`col1` = T2.`col1` and T2.`Max_col3`=t1.`col3`

希望这会有所帮助。

【讨论】:

  • 如果您从子查询中删除 col2,您的答案将符合 ANSI SQL 且可移植!
  • @SubinCPoonamgode:感谢您的解决方案,但如果出现平局,它会给出多行不!
  • 是的,它将返回多行。打平怎么办?我们可以按照你的要求做。
  • @SubinCPoonamgode 如果平局,我需要任何一行,不管它是哪一行。
【解决方案3】:

SQL 答案:

如果没有其他具有相同 col1 值且具有更高 col3 值的行,则使用 NOT EXISTS 返回一行。

select *
from tablename t1
where not exists (select 1 from tablename t2
                  where t2.col1 = t1.col1
                    and t2.col3 > t1.col3)

如果存在 max(c3) 并列,则将返回 col1 的两行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-09
    • 2021-08-21
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多