SQL查询与CASE语句,多个变量和子变量

问题描述 投票:0回答:4

我正在研究数据集,我需要在R-programmingSQLDF中编写以下要求的查询,我想知道并学习用两种语言(SQL and R)写作,请帮忙。

要求是:当Qazxswpoi 34和id 3的Total_Scores大于RankTotal_Scores 34和其他打印变量b时,我需要从表中打印变量“a”。以上情况适用于每个idid

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  )
sql r sqldf
4个回答
2
投票

您似乎希望每个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)

1
投票

你可以试试这个。

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


1
投票

在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

0
投票

假设你想要的是获得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
© www.soinside.com 2019 - 2024. All rights reserved.