具有CASE语句,多个变量和子变量的SQL查询

时间:2018-07-17 09:53:16

标签: sql r sqldf

我正在处理需要使用R-programmingSQLDF编写满足以下要求的查询的数据集,我想知道和学习用两种语言(SQL and R编写) ,请帮忙。

要求是:当需要从表中打印变量“ a”时,   id 34和Rank 3的Total_Scores大于Total_Scores 34的id和Rank 4 else Print Variable b。   以上情况适用于每个idRank

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

4 个答案:

答案 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

Sql Fiddle

答案 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)