Mysql 如何根据其他列查找一列的差异
我有一个如下所示的数据框Mysql 如何根据其他列查找一列的差异,mysql,sql,r,groupwise-maximum,Mysql,Sql,R,Groupwise Maximum,我有一个如下所示的数据框 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 我必须为每个不同的col1选择col2中有max(col3) 输出数据帧应如下所示: col
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
我必须为每个不同的col1
选择col2
中有max(col3)
输出数据帧应如下所示:
col1 col2 col3
A Z 15
B X 11
C Y 10
D L 16
如何在R
或SQL
提前感谢我们可以使用
数据表
。我们将“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)
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)tie,将返回col1的两行。在MySQL中的另一种方法 这是你的电话号码 输出:=>
希望这能有所帮助。非常感谢您的快速回复。:)不能像你回答的那样迅速接受你的回答。@ManojG谢谢你的反馈。我想大概需要10分钟左右。如果是平局,您在dplyr和data.table中的解决方案会有所不同。只是saying@akrun:我在一个数据框中应用了data.table解决方案,它由大约700万行组成,其中大约有470万行是唯一的col1,但我得到的输出是150万行。知道会出什么问题吗?@akrun:谢谢!我来试试:)你想如何处理领带?还有
library(data.table);unique(setorder(setDT(df),-col3),by=“col1”)
,尽管如前所述,您不清楚如何处理关系。对于每个组只返回sinlge行的dplyr方法(也适用于关系),请参阅@docendo discimus:没有关系,只要有一个关系出现,很好。@DavidArenburg:谢谢您的解决方案:)如果您从子查询中删除col2,您的答案将符合ANSI SQL并可移植@SubinCPoonamgode:谢谢你的解决方案,但如果是领带,它会给出多行na!是的,它将返回多行。有了领带怎么办?我们可以按照你的要求去做。@SubinCPoonamgode如果有领带,我需要其中的任何一行,不管它是哪一行。
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`