我正在研究数据集,我需要在R-programming
或SQLDF
中编写以下要求的查询,我想知道并学习用两种语言(SQL and R
)写作,请帮忙。
要求是:当Qazxswpoi 34和id
3的Total_Scores大于Rank
的Total_Scores
34和其他打印变量b时,我需要从表中打印变量“a”。以上情况适用于每个id
和id
Rank
我试着写id Rank Variable Total_Scores
34 3 a 11
34 4 b 6
126 3 c 15
126 4 d 18
190 3 e 9
190 4 f 10
388 3 g 20
388 4 h 15
401 3 i 15
401 4 x 11
476 3 y 11
476 4 z 11
536 3 p 15
536 4 q 6
声明,我卡住了,你能帮忙写一下查询
SQL CASE
最终输出应该是:
"select id ,Rank ,
CASE
WHEN (select Total_Scores from table where id == 34 and Rank == 3) > (select Total_Scores from table where id == 34 and Rank == 4)
THEN "Variable is )
您似乎希望每个ID的得分最高的行。在SQL中编写此代码的规范方法是使用id Rank Variable Total_Scores
34 3 a 11
126 4 d 18
190 4 f 10
388 3 g 20
401 3 i 15
536 3 p 15
:
row_number()
这会为每个select t.*
from (select t.*,
row_number() over (partition by id order by score desc) as seqnum
from t
) t
where seqnum = 1;
返回一行,即使得分是并列的。如果您想要所有行,请使用id
而不是rank()
。
另一种方法可以通过row_number()
上的索引获得更好的性能:
(id, score)
你可以试试这个。
select t.*
from t
where t.score = (select max(t2.score) from t t2 where t2.id = t.id);
SELECT T.* FROM (
SELECT id,
MAX(Total_Scores) Max_Total_Scores
FROM MyTable
GROUP BY id
HAVING MAX(Total_Scores) > MIN(Total_Scores) ) AS MX
INNER JOIN MyTable T ON MX.id = T.id AND MX.Max_Total_Scores = T.Total_Scores
ORDER BY id
在R
Sql Fiddle
数据
library(dplyr)
df %>% group_by(id) %>%
filter(Total_Scores == max(Total_Scores)) %>% filter(n()==1) %>%
ungroup()
# A tibble: 6 x 4
id Rank Variable Total_Scores
<int> <int> <chr> <int>
1 34 3 a 11
2 126 4 d 18
3 190 4 f 10
4 388 3 g 20
5 401 3 i 15
6 536 3 p 15
假设你想要的是获得df <- read.table(text="
id Rank Variable Total_Scores
34 3 a 11
34 4 b 6
126 3 c 15
126 4 d 18
190 3 e 9
190 4 f 10
388 3 g 20
388 4 h 15
401 3 i 15
401 4 x 11
476 3 y 11
476 4 z 11
536 3 p 15
536 4 q 6
",header=T, stringsAsFactors = F)
最大的Total_Scores
行的子集,这里有两种方法。
这个问题没有讨论如何处理关系。在示例中有一个id
有一个平局,但没有对应的输出,我认为这不是预期的,要么两个行都应该输出或其中一个。无论如何在(1)的下面的解决方案中,如果存在重复,它将任意给出一行,而(2)将给出两者。
1)sqldf
如果你在SQLite id
中使用max
,它会自动选择同一行的其他变量,所以:
select
赠送:
library(sqldf)
sqldf("select id, Rank, Variable, max(Total_Scores) Total_Scores
from DF
group by id")
2)基地R在基地R我们可以像这样使用 id Rank Variable Total_Scores
1 34 3 a 11
2 126 4 d 18
3 190 4 f 10
4 388 3 g 20
5 401 3 i 15
6 476 3 y 11
7 536 3 p 15
和ave
:
subset
赠送:
subset(DF, ave(Total_Scores, id, FUN = function(x) x == max(x)) > 0)
可重复输入的输入:
id Rank Variable Total_Scores
1 34 3 a 11
4 126 4 d 18
6 190 4 f 10
7 388 3 g 20
9 401 3 i 15
11 476 3 y 11
12 476 4 z 11
13 536 3 p 15