我正在处理需要使用R-programming
或SQLDF
编写满足以下要求的查询的数据集,我想知道和学习用两种语言(SQL and R
编写) ,请帮忙。
要求是:当需要从表中打印变量“ a”时,
id
34和Rank
3的Total_Scores大于Total_Scores
34的id
和Rank 4 else Print Variable b。
以上情况适用于每个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 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
答案 0 :(得分:2)
您似乎想要每个ID得分最高的行。用SQL编写此规范的方法是使用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);
答案 1 :(得分:1)
您可以尝试一下。
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
答案 2 :(得分:1)
在R
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)
答案 3 :(得分:0)
假设您要获取coordinates
对该行class Example extends model {
public function children() {
return $this->hasMany( __CLASS__ , 'parent', 'id');
}
}
$data = Example::with('children')->latest();
最大的行的子集,这是两种方法。
该问题未讨论如何处理关系。在该示例中,有一个Total_Scores
有一个平局,但是没有对应的输出,我认为这不是故意的,并且应该已经输出了两行或其中的一行。无论如何,在下面的(1)中的解决方案中,如果有重复项,它将任意给出一行,而(2)将给出两者。
1)sqldf
如果在SQLite id
中使用id
,它将自动选择同一行的其他变量,因此:
max
给予:
select
2)基数R 在基数R中,我们可以像这样使用library(sqldf)
sqldf("select id, Rank, Variable, max(Total_Scores) Total_Scores
from DF
group by id")
和 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)