从具有特定条件的Mysql获取数据

时间:2018-03-31 11:20:30

标签: mysql sql r dplyr

我有一个Mysql查询,它给出了我下面提到的输出:

输出:

ID      Date                     T1    T2
A-12    2017-01-01 15:05:20     -3     3
A-12    2017-01-01 15:05:20     -2     5
A-14    2017-01-01 15:05:20      6    -2
A-14    2017-01-01 15:05:20      8     12
A-15    2017-01-01 15:05:20      10    9
A-15    2017-01-01 15:05:20      13    15
A-17    2017-01-01 15:05:20      19    18

我只希望那些具有最小值的行(与ID不同)具有与T1T2值相对于每个ID的值,另外三列是{{1 }}和Range以及Minimum

范围:Count-5to55to1010to15

必需输出:

15to20

我的查询是:

ID      Date                     T1    T2   Range    Minimum  Count
A-12    2017-01-01 15:05:20     -3     3    -5to5    -3       2
A-14    2017-01-01 15:05:20      4    -2    -5to5    -2       2
A-15    2017-01-01 15:05:20      9     10    5to10    9       2
A-17    2017-01-01 15:05:20      18    19    15to20   18      1

2 个答案:

答案 0 :(得分:2)

嗯。这在MySQL中有点复杂

SELECT t1.ID, t1.Date, t2.T1, t2.T2,
       CONCAT(t2.T1, 'to', t2.t2) as range,
       t2.T1 as minimum
FROM Table1 t1 LEFT JOIN
     Table2 t2
     ON t1.re = t2.re
WHERE t1.Date >= '2017-01-01' AND
      (T1.ID, t2.T1) IN (SELECT tt1.ID, MIN(tt2.Ti)
                         FROM Table1 tt1 JOIN
                              Table2 tt2
                              ON tt1.re = tt2.re
                         WHERE t1.Date >= '2017-01-01'
                         GROUP BY tt1.ID
                        );

答案 1 :(得分:1)

在R中,一旦您连接到数据库(例如使用DBI),就可以使用dplyr包执行以下操作。

library(dplyr)
breaks <- c(-Inf, -5, 5, 10, 15, 20, Inf)
labels <- c('-Infto-5','-5to5','5to10','10to15', '15to20', '20toInf')
df %>% group_by(ID) %>% 
  mutate(Minimum = min(T1,T2)) %>%
  mutate(Range = cut(Minimum, breaks = breaks, labels = labels)) %>%
  mutate(Count = n()) %>%
  filter(T1 == Minimum | T2 == Minimum)